为 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 可在您的 ComplicationController
和 InterfaceController
中访问
在 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
引用它来构建您的 InterfaceController
或 ComplicationsController
单例的想法是你有一个全局引用。 DataManager 只被实例化一次,而且只有一次。
我正在做一个 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 可在您的 ComplicationController
和 InterfaceController
在 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
引用它来构建您的 InterfaceController
或 ComplicationsController
单例的想法是你有一个全局引用。 DataManager 只被实例化一次,而且只有一次。