在阅读IQKeyboardManager看到了UIApplication.shared.sendAction(之前自己项目里并没有用到)。
UIApplication.shared.sendAction大意是分发一个event到另外一个对象去处理。然后我就写了一个demo。用于数据回传。刷新界面的。
项目组成。ViewController是与Main.Storyboard进行关联的。SecondeVC为继承UIViewController的类。主要就是从ViewController的Button里面跳转到SecondeVC,然后通过SecondeVC的按钮调用UIApplication.shared.sendAction并pop回去。
代码 let sb = UIStoryboard.init(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "viewController")
print("ready")
UIApplication.shared.sendAction(#selector(ViewController.showLabel), to: vc, from: self, for: nil)
self.navigationController!.popViewController(animated: true)
ViewController的
@objc func showLabel(){
print("fffffff")
if label != nil {
print("abnfjflskfjls")
label?.text = "数据回传"
}else{
print("i am nil")
}
}
打印显示i am nil。一开始有点懵了。然后自己一看。使用Storyboard取得vc是新的一个界面。
在print("ready")加print(vc.view)。在这里解释一个事情:如果从Storyboard取的VC,无论是自定义的控件还是从Storyboard进行关联。都是在loadView进行绑定的。ViewController的不再打印i am nil。然而label的数据还是不刷新。然后我尝试了使用Protocol(相当于OC的delegate)进行回调和数据刷新,这里不进行详细描述了,界面刷新没问题。这样就排除了界面上布局和刷新的错误。再次思考UIApplication.shared.sendAction(难道不能刷新界面)。这时候想到另外一个方法。
在SecondVC的事件响应中这样取VC代码如下:
let arr :[UIViewController] = (self.navigationController?.viewControllers)! as [UIViewController]
let mtArr:NSMutableArray = NSMutableArray.init(array: arr)
let vc = mtArr.object(at: mtArr.count - 2) as! ViewController。其它都一样,还是使用UIApplication.shared.sendAction(#selector(ViewController.showLabel), to: vc, from: self, for: nil),然而神奇的事情发生了。ViewController的label数据刷新了。
总结一句话使用UIApplication.shared.sendAction进行事件回调刷新,使用NavigationController的栈结构进行VC操作。Protocol的话都是可以的。
网友评论