视图加载前的 Swift 观察者

Posted

技术标签:

【中文标题】视图加载前的 Swift 观察者【英文标题】:Swift observer before view loaded 【发布时间】:2017-10-20 08:57:42 【问题描述】:

我正在使用 SWReveal 创建一个滑出菜单。

当应用加载时,它会显示一个主页,其中包含指向应用中其他页面的按钮。按下按钮后,将执行 a segue 并更新菜单,突出显示新选择的页面,以便下次拉出菜单时,它会指示用户当前所在的页面。

我正在使用观察者来更新菜单,如下所示。一旦加载了滑动菜单然后按下按钮,代码就可以正常工作。

但是,由于尚未创建滑动菜单观察者,因此首次加载主页时它不起作用。

我的问题:有没有办法在加载主页后初始化滑动菜单以便创建观察者?还是有一种我没有看到的解决方法?

swipeMenu.swift(接收通知):

override func viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(self.changeGiveaway(notification:)), name: Notification.Name("changeGiveaway"), object: nil)



func changeGiveaway(notification: Notification)

     print("Change giveway was called")

    homeShadow.isHidden = true
    yanaLiveVideoShadow.isHidden = true
    yanaChatShadow.isHidden = true
    yanaShopShadow.isHidden = true
    yanaProfileShadow.isHidden = true
    horoscopesShadow.isHidden = true
    fortuneTellerShadow.isHidden = true
    dailyGiveAwayShadow.isHidden = false




home.swift(发布通知):

@IBAction func dailyGiveAway(_ sender: Any) 

    NotificationCenter.default.post(name: Notification.Name("changeGiveaway"), object: nil)
    performSegue(withIdentifier: "giveAway", sender: self)


【问题讨论】:

【参考方案1】:

这里最好的方法可能是使用委托。

您可以创建:

protocol GiveAwayDelegate: class 
     func changeGiveAway()


var delegate: GiveAwayDelegate?

@IBAction func dailyGiveAway(_ sender: Any) 
    self.delegate?.changeGiveAway()


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let destination = segue.destination as? DestinationViewController 
            destination.delegate = self
        

最后在你的 ViewController 中:

class ViewController: UIViewController, GiveAwayDelegate 

    func changeGiveaway(notification: Notification)

         print("Change giveway was called")

         ...

     

【讨论】:

以上是关于视图加载前的 Swift 观察者的主要内容,如果未能解决你的问题,请参考以下文章

Swift viewcontroller firebase 数据库观察者重复调用

观察 Swift 结构体的变化

文件上传进度的通知观察者模式仅在文件很大时才有效 - swift?

如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?

添加观察在 Swift 4 中不起作用

如何通过另一个可观察对象观察已发布的属性 - Swift Combine