【问题标题】:Get data from Dictionary for Table从字典中获取数据
【发布时间】:2015-09-29 18:45:01
【问题描述】:

我有一个 WatchKit table,我需要用我收到的数据(从 iOS 到 WatchKit)填充它。我不知道如何解开Dictionary 中的数据以供table 使用

我在 WatchKit 中有数据InterfaceController.swift

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

    let dic3 = userInfo["TColor"] as? String
    let dic4 = userInfo["Match"] as? String

    dispatch_async(dispatch_get_main_queue()) {
        //
    }
}

WatchKit Event.swift(主对象的子类)

class Event {

var eventTColor:String
var eventMatch:String

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

class func newEvent(dataDictionary:Dictionary<String,String>) -> Event {
    return Event(dataDictionary: dataDictionary)
}

class func eventsList() -> [Event] {

    var array = [Event]()
    let dataPath = // Not sure what to do here

    let data = // Not sure what to do here either

    for e in data as! [Dictionary<String, String>] {
        let event = Event(dataDictionary: e)
        array.append(event)
    }

    return array
}

}

我不知道在我缺少的函数class func eventsList() -&gt; [Event] 中要做什么。

我需要从didReceiveUserInfo 收到的Dictionary 获取信息。

或者也许有一些更好/其他的方法来解决这个问题?将根据需要发布任何额外的代码。

编辑:到目前为止,这就是我正在尝试的 didFInishUserInfoTransfer

func session(session: WCSession, didFinishUserInfoTransfer userInfoTransfer: WCSessionUserInfoTransfer, error: NSError?) {
        if let someError = error {
            print("error on didFinishUserInfoTransfer: %@", someError)
        } else {
            let eventsList = Event.eventsListFromValues(receivedData)
            NSLog("Events List: %@", eventsList)

        }
    }

func doTable() {

eventsListSO = Event.eventsListFromValues(receivedData)
rowTable.setNumberOfRows(eventsListSO.count, withRowType: "rows")
NSLog("Row count: %@", eventsListSO.count)

for var i = 0; i < self.rowTable.numberOfRows; i++ {
    let row = rowTable.rowControllerAtIndex(i) as? TableRowController
    print("Row")
    for eventm in eventsListSO {
        row!.mLabel.setText(eventm.eventMatch)
        NSLog("SetupTableM: %@", eventm.eventMatch)
    }
}

}

【问题讨论】:

    标签: ios swift uitableview nsdictionary watchkit


    【解决方案1】:

    从发布的代码中很难看出,但看起来您的InterfaceController 正在以userInfo 字典参数中的两个String 值的形式接收单个事件的数据。大概如果您期望一个列表,则此方法会被多次调用。

    如果上述情况属实,那么在InterfaceController 中创建InterfaceController 类型的Array&lt;Dictionary&lt;String,String&gt;&gt; 属性(或等效的[[String : String]],我个人认为其可读性较差)可能是有意义的,如下所示:

    var receivedData = Array<Dictionary<String, String>>()
    

    然后在您的session:didReceiveUserInfo: 实现中,您会将内容附加到receivedData 属性,如下所示:

    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])
        }
        else {
            // Appropriate error handling here
        }
    }
    

    然后您的 eventsList 方法需要更改为接受您的 Dictionary 值并对其进行处理,可能像这样:

    class func eventsListFromValues(values: Array<Dictionary<String, String>>) -> Array<Event> {
        var array = Array<Event>()
    
        for eventValues in values {
            let event = Event(dataDictionary: eventValues)
            array.append(event)
        }
    
        return array
    }
    

    有了这些东西,您现在就有了数据值的集合,您需要确定何时是构建 ArrayEvent 对象的合适时间。也许在每次调用session:didReceiveUserInfo: 之后使用如下代码:

    let eventsList = Event.eventsListFromValues(receivedData)
    for event in eventList {
      // Do something with the events list (i.e., use event.eventTColor and event.eventMatch)
    }
    

    显然,我的这个答案是基于对正在发生的事情的一些假设,所以它可能并不完全适合你正在发生的事情,但希望能让你朝着正确的方向前进。另外,我在没有编译器的情况下编写了这段代码,因此可能需要一些小的调整。

    【讨论】:

    • 哇,这是一个非常好的答案,非常感谢!问题:在eventsListFromValues 上,我在let event = Event(dataDictionary: e) 行上收到一个错误,因为我从不使用e,我敢肯定你意识到了这一点并假设我可以充实它,但我被困在哪里去正是这样。你能告诉我你要去哪里吗,因为我不明白。谢谢!
    • (另外,是的,据我所知,您的假设是正确的!)
    • 究竟是什么错误?如果它告诉您您没有在使用 e 的行上使用它,那就太奇怪了。
    • 我认为在那条线上我需要使用let event = Event(dataDictionary: eventValues) 而不是let event = Event(dataDictionary: e),如果您觉得这听起来不错?
    • 这与为receivedData 声明 var 属性相同。在您的InterfaceController 中的某个位置可能类似于var eventsList = Array&lt;Event&gt;()。然后,您只需编写 eventsList = ...,而不是稍后的 let eventsList = ...,这会将其分配给类属性。
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多