为 ComplicationController 使用 InterfaceController 逻辑

Using `InterfaceController` logic for `ComplicationController'

我正在做一个 Apple Watch App,有一个 Complication

我的 WatchKit App 部分工作得很好 这个 Ev class...

class Ev {
    var evTColor:String
    var evMatch:String

    init(dataDictionary:Dictionary<String,String>) {
        evTColor = dataDictionary["TColor"]!
        evMatch = dataDictionary["Match"]!
    }

    class func newEv(dataDictionary:Dictionary<String,String>) -> Ev {
        return Ev(dataDictionary: dataDictionary)
    }

}

...还有这个InterfaceController

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {

    if let tColorValue = userInfo["TColor"] as? String, let matchValue = userInfo["Match"] as? String {

        receivedData.append(["TColor" : tColorValue , "Match" : matchValue])
        evs.append(Ev(dataDictionary: ["TColor" : tColorValue , "Match" : matchValue]))

        doTable()

    } else {
        print("tColorValue and matchValue are not same as dictionary value")
    }

}


func doTable() {

    self.rowTable.setNumberOfRows(self.evs.count, withRowType: "rows")

    for (index, evt) in evs.enumerate() {

        if let row = rowTable.rowControllerAtIndex(index) as? TableRowController {

            row.mLabel.setText(evt.evMatch)
            row.cGroup.setBackgroundColor(colorWithHexString(evt.evTColor))

        } else {
            print("nope")
        }
    }

}

很难在我的复杂功能中使用同样的东西,有什么想法吗?

我不确定我是否可以为我的 ExtensionDelegate 使用相同的 Ev 代码,然后我的 ComplicationController.

中到底放了什么

如果我在 ExtensionDelegate 中使用相同的 Ev 代码,我会收到 致命错误:使用未实现的初始化程序 init()

并且在我的 ComplicationController 中,我不确定如何最好地使用我已经从 InterfaceController 获得的数据来填写 getCurrentTimelineEntryForComplication &getTimelineEntriesForComplication ComplicationController.

中的方法

能否post需要任何额外的代码,谢谢!

编辑: 每个问题,我的数据来自 CloudKit 到 iPhone 应用程序(然后我通过 WCSession 传递给 Watch 应用程序,所以我的问题是在我的 Watch 应用程序中访问该数据并发症)

我不会让您的 InterfaceController 实施和接收 WCSession 消息,而是设置一个单独的 class 来接收这些消息。 class 可以解析和组织来自 WCSession 的用户信息数据。该单例 class can/will 可在您的 ComplicationControllerInterfaceController

中访问

在 swift 中设置单例相当容易:

class DataManager : WCSessionDelegate {
    // This is how you create a singleton
    static let sharedInstance = DataManager()

    override init() {
        super.init()
        if WCSession.isSupported() {
            self.watchConnectivitySession?.delegate = self
            self.watchConnectivitySession?.activateSession()
        }
    }

    // This is where you would store your `Ev`s once fetched
    var dataObjects = [Ev]()

    // This is the method that would fetch them for you
    func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
        //parse your userInfoDictionary
        self.dataObjects = evs
    }
}

然后在您的 InterfaceController 中,您可以使用 DataManager.sharedInstance.dataObjects 引用它来构建您的 InterfaceControllerComplicationsController

单例的想法是你有一个全局引用。 DataManager 只被实例化一次,而且只有一次。