Ошибка цепочки респондента
Я хочу перевести этот вид кода Objective C на Swift:
- (UINavigationController *)targetNaviCtrl{
if(!_targetNaviCtrl){
UIResponder *target = self.nextResponder;
do {
target = target.nextResponder;
} while (![target isKindOfClass:UINavigationController.self] && target != nil);
_targetNaviCtrl = (UINavigationController *)target;
}
return _targetNaviCtrl;
}
// by iterate its next responder, so I can get access the target viewController to do something.
// This is often used across several hierarchies.
// A root B, B push C , C push D. I use A in D viewController.
Я встретил некоторые проблемы.
декларация
var next: UIResponder? { получить }
Возвращаемое значение
Следующий объект в цепочке респондента или ноль, если это последний объект в цепочке.
Я хочу получить доступ к левому tarBarController в правом viewController.
Класс ViewControllerEightLayer
// правильный viewController.
class ViewControllerEightLayer: UIViewController {
override var next: UIResponder?{
get{
return super.next
}
}// the right viewController.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
var nextResponder = self.next! // Here I call it
}
Здесь я это называю, вот информация об ошибке:
Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения
Класс LayerTableVC
// немного правый центр UITableViewController.
class LayerTableVC: UITableViewController {
override var next: UIResponder?{
get{
return super.next
}
}// the center a little right UITableViewController.
Класс LayerNavigationVC
// немного ушёл центр UINavigationController.
class LayerNavigationVC: UINavigationController {
override var next: UIResponder?{
get{
return super.next
}
}// the center a little left UINavigationController.
Класс MainTabBarVC
// левый tarBarController
class MainTabBarVC: UINavigationController {
override var next: UIResponder?{
get{
return self
}
}// the left tarBarController
Я не знаю, как решить это таким образом. Какие-либо предложения?
Может быть, это помогает,
self.next?.target(forAction: <#T##Selector#>, withSender: <#T##Any?#>)
Кажется, проводной.
Я сделал это по коду,
let tabBarViewController = UIApplication.shared.keyWindow!.rootViewController as! UITabBarController
И я хочу знать решение цепочки респондента
PS:
Целью копаться в цепочке респондента является любопытство.
Это случилось, я не думаю, что это произойдет.
Поэтому мне интересно, почему.
Я бы хотел реверс-инжиниринг.
PPS:
Мое намерение состоит в том, чтобы контролировать панель инструментов, чтобы скрыть и показать. Не предоставлять данные для
extension ViewControllerEightLayer: UITextFieldDelegate{
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField.text == "1" {
tabBarViewController.tabBar.isHidden = false
}
else{
tabBarViewController.tabBar.isHidden = true
}
return true
}
Это личный экспериментальный проект, а не моей корпорации.
1 ответ
Вы, кажется, спрашиваете, как пройти по цепочке респондента. Вот как.
func showResponderChain(_ r: UIResponder) {
var r : UIResponder! = r
repeat { print(r, "\n"); r = r.next } while r != nil
}