【问题标题】:How to update WKInterfaceController / UIViewControllers after receiving data via WatchConnectivity通过 WatchConnectivity 接收数据后如何更新 WKInterfaceController / UIViewControllers
【发布时间】:2015-10-24 04:04:04
【问题描述】:

我阅读了一些帖子以在委托而不是控制器中设置 WCWatchConnectivity 会话。您如何将委托中收到的数据传输到控制器进行进一步处理(在 Swift 中)?

【问题讨论】:

    标签: ios delegates swift2 watchconnectivity


    【解决方案1】:

    在您的委托类中:

    如果您需要更新多个视图控制器,您可以将委托类实现为单例,以便能够从应用或扩展的任何部分添加观察者(就像 Apple 使用其 NSNotificationCenter 类所做的那样):

    class WatchSessionDelegate {
        static let sharedDelegate = WatchSessionDelegate()
        private override init() {}
        ....
    }
    

    你可以定义一个观察者协议:

    protocol DataObserver {
        func dataDidChange(data: AnyObject)
    }
    

    然后你添加一个观察者数组到你的委托类中:

    private var observers = [DataObserver]()
    

    以及添加和删除观察者的两种方法:

    func addObserver(observer: DataObserver) {
       // add the observer to observers
    }
    
    func removeObserver(observer: DataObserver) {
       // remove the observer from observers
    }
    

    然后,当接收到数据时,您遍历观察者并调用协议中定义的方法:

    func didReceiveData(data: AnyObject) {
        for observer in observers {
            observer.dataDidChange(data)
        }
    }
    

    在您的 UIViewControllers / WKInterfaceController 类中:

    要通知 UIViewController 或 WKInterfaceController 有关数据更改,只需使其符合 DataObserver 协议并将其添加到观察者:

    WatchSessionDelegate.sharedDelegate.addObserver(self)
    

    并从协议中实现方法:

    func dataDidChange(data: AnyObject) {
        // update UI
    }
    

    【讨论】:

    • 谢谢乔恩。刚刚尝试了上述方法,但在尝试添加到观察者时在复杂控制器中出现错误:'ExtensionDelegate.sharedDelegate.addObserver(self)' 说明 ExtensionDelegate 没有成员 sharedDelegate。我在覆盖初始化中这样做。
    • 我假设您会将您的委托实现为单例。我会将此添加到我的答案中。
    • 请记住不要尝试通过init 初始化委托类。始终使用YourDelegateClass.sharedDelegate 访问委托类。它是自动初始化的。事实上,如果您尝试在其上调用 init,您会收到错误消息(这就是私有初始化覆盖的用途)
    • 谢谢乔恩!赞赏
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多