Обновить запрос данных текущего контроллера представления при нажатии кнопки XIB

#ios #swift #xib

#iOS #swift #xib

Вопрос:

Я хочу, чтобы страницы обработки ошибок были доступны для всех моих контроллеров представления, поэтому при ошибке выборки данных отображается не только диалоговое окно, но и файлы XIB, содержащие сообщение об ошибке и кнопку для обновления. Вот так:

введите описание изображения здесь

Вот код класса XIB:

 import UIKit

class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    static var message: String?

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    @IBAction func didTapTryAgain(_ sender: Any) {
        Dialog.showProgressDialog(info: "")
    }
}
 

Вот мой код базового контроллера, который решает все проблемы.

 import Foundation

class BaseViewController: UIViewController {

    var uiView =  UIView();

    override func viewDidLoad() {

    }

    func getErrorMessage(message:String) {
        super.viewDidLoad()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
        self.view.addSubview(viewErrorMessage)
    }

}
 

И вот как я вызываю это в другом классе, который я расширяю BaseViewController , чтобы он мог показывать проблему с ошибкой глобально, без повторного объявления класса:

 func onFailedDeleteCart(errorMessage: String) {
        getErrorMessage(message: errorMessage)
    }
 

Прямо сейчас я могу передать сообщение об ошибке.

Проблема в том, что я хочу, чтобы кнопка обновления обновляла текущий контроллер представления, когда я нажимаю на нее. Возможно, вызов viewDidLoad текущего контроллера представления при нажатии на него будет хорошей логикой, но я не знаю, как реализовать это в классе XIB.Кто-нибудь может решить это? Спасибо!

Комментарии:

1. Вы можете использовать completion handler или delegate для достижения этой цели.

Ответ №1:

Подход: 1

Шаг: 1 Создайте закрытие для обратного вызова

 typealias RefreshBlock = (()->())?
 

Шаг: 2 Определите замыкание в вашем UIView классе

Шаг: 3 Закрытие вызова, если пользователь нажал кнопку обновления

 class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    var refreshBlock:RefreshBlock!
    static var message: String?

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    // Step : 3
    @IBAction func didTapTryAgain(_ sender: UIButton) {
        refreshBlock!()
    }
}
 

Шаг: 4 Присвоить значение при закрытии при addSubview вызове

 class BaseViewController: UIViewController {

    override func viewDidLoad() {
    }

    func getErrorMessage(message:String) {
        super.viewDidLoad()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
        viewErrorMessage.refreshBlock = {()
            self.viewDidLoad()
            print("Refresh Contents")
        }   
        self.view.addSubview(viewErrorMessage)
    }

}
 

Подход: 2

Передайте вашу текущую UIViewController ссылку в UIView класс. См. Приведенный ниже код.

 class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    var currentVC:UIViewController!
    static var message: String?

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    @IBAction func didTapTryAgain(_ sender: UIButton) {
        currentVC.viewDidLoad()
    }
}


class BaseViewController: UIViewController {

    override func viewDidLoad() {

    }

    func getErrorMessage(message:String) {
        super.viewDidLoad()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
        viewErrorMessage.currentVC = self
        self.view.addSubview(viewErrorMessage)
    }

}
 

Комментарии:

1. Это здорово. Но как получить доступ к viewErrorMessage.refreshBlock = {() print(«Содержимое Refesh») } с другого контроллера представления? Так что я могу сделать запрос там

2. viewErrorMessage.refreshBlock = {() print(«Содержимое Refesh») } уже находится в UIViewController

3. о, извините, я поместил viewErrorMessage.refreshBlock = {() print(«Refesh contents»)} на мой базовый контроллер, который расширяет UIViewController. Я хочу получить доступ к этому в другом контроллере, который я расширяю своим BaseController