我有一个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() -> [Event]
中应该做些什么。
我需要从Dictionary
收到的didReceiveUserInfo
中获取相关信息。
或者可能有更好/其他方法来解决这个问题?将根据需要发布任何额外的代码。
编辑:这是我到目前为止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)
}
}
}
答案 0 :(得分:1)
从发布的代码中看起来有点难以辨别,但看起来InterfaceController
正在String
中以{userInfo
个值的形式接收单个事件的数据1}}字典参数。大概如果你期待一个列表,这个方法会被多次调用。
如果以上情况属实,那么在var
类型InterfaceController
(或等效Array<Dictionary<String,String>>
}中创建[[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
}
有了这些东西,您现在拥有了一组数据值,您需要确定何时构建Array
Event
个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)
}
之后都会使用如下代码:
if (payment.value){
switch (payment.value) {
case 'Credit Card'
cost = cost + (cost * 0.2);
break;
case 'Gold Bullion'
cost = cost + (cost * 0.5);
break;
default: cost;
}
<label for="type">Payment Method</label> <select name="payment" id="payment" required>
<option value="DC">Debit Card</option>
<option value="CC">Credit Card</option>
<option value="Cash">Cash</option>
<option value="GB">Gold Bullion</option>
</select>
显然,我的答案基于对某些事情的一些假设,因此对于你所做的事情可能并不正确,但希望能让你朝着正确的方向前进。此外,我编写此代码时没有编译器,因此可能需要一些小的调整。