响应者链错误

时间:2018-04-11 17:14:54

标签: ios swift responder-chain

我想将这种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.

我遇到了一些麻烦。

code repo

Apple Doc: next

  

声明

     

var next:UIResponder? {get}

     

返回值

     

响应者链中的下一个对象,如果这是链中的最后一个对象,则为nil。

dist

我想访问右侧viewController中的左侧tarBarController。

类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:致命错误:在解包可选值时意外发现nil

class LayerTableVC

//中心有点UITableViewController。

 class LayerTableVC: UITableViewController {
    override var next: UIResponder?{
        get{
           return super.next
        }
  }// the center a little right UITableViewController.

class 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 个答案:

答案 0 :(得分:1)

您似乎在询问如何走上响应链。这是怎么回事。

func showResponderChain(_ r: UIResponder) {
    var r : UIResponder! = r
    repeat { print(r, "\n"); r = r.next } while r != nil
}