【发布时间】: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.
我遇到了一些麻烦。
声明
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 Layer到Layer Cases View Controller的数据? -
话虽如此,@DonMag 是对的。挖掘响应者链的目的是什么?
-
不,我不明白。
next已经存在并且正确地做它做的事情。覆盖它只是一种破坏东西的方法(这就是你似乎正在做的事情)。 -
我说
next已经存在,因为它确实存在。 developer.apple.com/documentation/uikit/uiresponder/…
标签: ios swift responder-chain