美文网首页
UIApplication.shared.sendAction使

UIApplication.shared.sendAction使

作者: 售前界的不死小强 | 来源:发表于2017-04-12 09:48 被阅读240次

    在阅读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使

          本文链接:https://www.haomeiwen.com/subject/bgipattx.html