我想将这种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? {get}
返回值
响应者链中的下一个对象,如果这是链中的最后一个对象,则为nil。
我想访问右侧viewController中的左侧tarBarController。
//右侧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
//中心有点UITableViewController。
class LayerTableVC: UITableViewController {
override var next: UIResponder?{
get{
return super.next
}
}// the center a little right UITableViewController.
//中心稍微离开UINavigationController。
class LayerNavigationVC: UINavigationController {
override var next: UIResponder?{
get{
return super.next
}
}// the center a little left UINavigationController.
//左边的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
}
这是一个个人实验项目,而不是我的公司。
答案 0 :(得分:1)
您似乎在询问如何走上响应链。这是怎么回事。
func showResponderChain(_ r: UIResponder) {
var r : UIResponder! = r
repeat { print(r, "\n"); r = r.next } while r != nil
}