#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