Ошибка цепочки респондента

Я хочу перевести этот вид кода 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.

Я встретил некоторые проблемы.

код репо


Apple Doc: следующий

декларация

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
}
Другие вопросы по тегам