WatchKit Complication:从扩展委托获取复杂数据
Posted
技术标签:
【中文标题】WatchKit Complication:从扩展委托获取复杂数据【英文标题】:WatchKit Complication: get Complication data from extension delegate 【发布时间】:2015-10-17 19:27:01 【问题描述】:我的 WatchKit 扩展程序中有我需要的所有数据(从 iOS 应用程序传递)。
我用WatchKitInterfaceController
中的数据填表,效果很好。
我正在尝试找出在我的 WatchKit ComplicationController
中获取相同数据的最佳方法。
目前,在InterfaceController
中,数据使用didReceiveUserInfo
传入:
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
if let beachValue = userInfo["Surf"] as? String
places.append(Place(dataDictionary: ["Surf" : surfValue]))
else
print("Something went wrong")
我是否需要在我的ComplicationController
中调用同样的WCSession
方法并再次抓取整个数据,或者是否有任何更简单的方法可以让我访问同样的数据用于ComplicationController
?
任何帮助表示赞赏。谢谢!
编辑:
我的表格功能:
func makeTable()
// Per SO
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
let accessVar = myDelegate.places
self.rowTable.setNumberOfRows(accessVar.count, withRowType: "rows")
for (index, evt) in accessVar.enumerate()
if let row = rowTable.rowControllerAtIndex(index) as? TableRowController
row.mLabel.setText(evt.evMat)
else
print(“No”)
【问题讨论】:
我想知道完全相同 :-) developer.apple.com/library/watchos/documentation/General/… 的 Apple 文档说:// 从扩展委托中获取并发症数据。让 myDelegate = WKExtension.sharedExtension().delegate 为! ExtensionDelegate var 数据:字典 = myDelegate.myComplicationData[ComplicationCurrentEntry]!如果有人可以向 ios 新手解释如何将其应用于我自己的代码,我将不胜感激。基本上我的应用程序数据是一组自定义对象。 @Alex 是的,我在文档中也看到了这一点,并试图弄清楚。我不确定它是说使用ExtensionDelegate
作为设置WCSession
信息的地方(就像你在iOS 端的AppDelegate
中所做的那样)或什么。但是,是的,我也不是很清楚。如果你发现了什么,请告诉我!
【参考方案1】:
// Get the complication data from the extension delegate.
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!
以上来自Apple's Doc 只是一个示例,用于在扩展委托中存储复杂性所需的数据,看看如何作为单例轻松访问它。对“myComplicationData”的引用是 Dictionary 的示例,默认情况下不是 ExtensionDelegate 中的参数。
或者将你自己的类设置为一个单例,它为你的手表保存数据,如下所示:
// Access by calling:
// Model.sharedModel.modelVal1
class Model
static let sharedModel = Model()
var modelVal1: Float!
var modelVal2: String!
或者使用扩展委托作为你的单例并将你的属性添加到它的类中,如下所示。这将允许您访问您在 ExtensionDelegate 中创建的任何变量。
// ExtensionDelegate.swift
class ExtensionDelegate: NSObject, WKExtensionDelegate
var dataVar1: Float!
var dataVar2: String!
var myDictionary: [String: String]!
// ComplicationController.swift
import WatchKit
class ComplicationController: NSObject, CLKComplicationDataSource
func someMethod()
let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate
// Here is an example of accessing the Float variable
let accessVar = myDelegate.dataVar1
let myDict = myDelegate.myDictionary
使用任何一种方式都有助于将您的数据保存在一个位置,以便您始终可以从手表扩展程序中的任何类访问它。
【讨论】:
您好,感谢您的回复,我会试试这个,我会告诉你的! 我无法让 Apple 的 Doc 链接正常工作,所以我是将前两行放在ExtensionDelegate.swift
或 ComplicationController.swift
中吗? (let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!
)
如果您像我一样设置 ExtensionDelegate,那么您将必须通过您的命名来访问您的变量。我将在上面更新此答案以显示我将如何访问这些变量。你遇到了什么错误?
在ComplicationController
中,let accessVar = myDelegate.dataVar1
和let myDict = myDelegate.myDictionary
都出现错误“ExtensionDelegate 类型的值没有成员...”。我的意思是,ExtensionDelegate
中没有 myDictionary
,但有 dataVar1
,所以它应该可以正常工作而不会出现错误,但因为不是,我无法弄清楚发生了什么。有任何想法吗?谢谢!
您需要在 ExtensionDelegate 中声明变量“dataVar1”和“myDictionary”,就像我上面所说的,那么您应该不会收到这些错误。当然,您可以为它们命名任何您喜欢的名称。【参考方案2】:
好吧,我在我的应用程序中所做的是设置另一个 singelton 类来负责为我的 Watch 应用程序和复杂功能获取和保存数据。但这对我来说似乎不是最好的方式。不幸的是,我没有得到 Apple 代码
var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!
完全没有。我不明白这个myComplicationData
来自哪里。
【讨论】:
是的,我仍在努力解决。希望有人突然来帮助我们,但我会在此期间继续努力解决问题,如果我这样做了会告诉你 你有想过这个吗? 不,我仍在使用自己的单例类来保存手表应用程序和并发症的数据... 但正如安东尼奥尼所说,使用单例似乎是一种有效的方式以上是关于WatchKit Complication:从扩展委托获取复杂数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?
handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication