ios - 响应链错误

标签 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

Declaration

var next: UIResponder? { get }

Return Value

The next object in the responder chain or nil if this is the last object in the chain.

dist

我想在右边的 viewController 中访问左边的 tarBarController。

ViewControllerEightLayer 类

//正确的 View Controller 。

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
}

我在这里调用它,这是错误信息:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

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

我想知道响应者链解决方案


附言:

挖掘响应者链的目的是出于好奇。

它发生了,我认为它不会发生。

所以我想知道为什么。

我想进行逆向工程。


PPS:

我的本​​意是控制工具栏的隐藏和显示。不提供数据从到

 extension ViewControllerEightLayer: UITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField.text == "1" {
            tabBarViewController.tabBar.isHidden = false
         }
         else{
             tabBarViewController.tabBar.isHidden = true
         }
         return true
   }

这是一个个人实验项目,不是我公司的。

最佳答案

您似乎在询问如何走上响应链。方法如下。

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

关于ios - 响应链错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49780970/

相关文章:

ios - 表格 View 中的表格 View swift

IOS浏览器一旦滚动就不会缩小页面内容

ios - 如果不允许约束,如何移动 CAGradientLayer 及其父 UIView 容器?

ios - 为什么要在 ScrollView 下放一个 View

ios - 为什么 ARKit MDLTransform 从相机变换中随机返回 0?

swift - NSWindow 在关闭 NSPopover 后失去了第一响应者

ios - 如何在表格 View 框架之外调用表格 View 单元格单击事件?

swift - 通过Decodable初始化Realm对象

ios - KVO 全局范围

swift - 在 cocoa 应用程序中更改 Tab 键顺序(焦点)