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.swiftComplicationController.swift 中吗? (let myDelegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate var data : Dictionary = myDelegate.myComplicationData[ComplicationCurrentEntry]!) 如果您像我一样设置 ExtensionDelegate,那么您将必须通过您的命名来访问您的变量。我将在上面更新此答案以显示我将如何访问这些变量。你遇到了什么错误? ComplicationController 中,let accessVar = myDelegate.dataVar1let 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 发送消息并得到回复如此缓慢?

从 watchkit 扩展中基于页面的导航开始分层导航

如何在 WatchKit 扩展中计算当前位置

xCode 排除用于提交的 watchkit 扩展

handleWatchKitExtensionRequest 未响应 Watchkit 扩展(Swift)中的 openParentApplication

无法在 WatchKit 扩展(CocoaPods)中使用 Parse 库