UIApplication.shared.sendAction使用注意点

在阅读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的话都是可以的。

你可能感兴趣的:(UIApplication.shared.sendAction使用注意点)