【问题标题】:Responder chain error响应链错误
【发布时间】:2018-04-11 17:14:54
【问题描述】:

我想把这种 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? {得到}

返回值

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

我想在右边的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

类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:

我的意图是控制工具栏的隐藏和显示。不提供来自 to 的数据

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

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

【问题讨论】:

  • “我调用它,我失败了” 失败了怎么办?没有找到?
  • 我想知道您是否问错了问题...您是否打算提供从View Controller Eight LayerLayer Cases View Controller 的数据?
  • 话虽如此,@DonMag 是对的。挖掘响应者链的目的是什么?
  • 不,我不明白。 next 已经存在并且正确地做它做的事情。覆盖它只是一种破坏东西的方法(这就是你似乎正在做的事情)。
  • 我说next 已经存在,因为它确实存在。 developer.apple.com/documentation/uikit/uiresponder/…

标签: ios swift responder-chain


【解决方案1】:

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

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

【讨论】:

  • 语言无关。
猜你喜欢
  • 2019-03-01
  • 2019-05-26
  • 1970-01-01
  • 2016-11-03
  • 2017-06-11
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多