Обновление запроса данных текущего представления контроллера при нажатии кнопки XIB - PullRequest
0 голосов
/ 15 апреля 2019

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

enter image description here

Вот код класса 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)
    }

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

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

1 Ответ

0 голосов
/ 15 апреля 2019

Подход: 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)
    }

}
...