2015-10-10 4 views
0

У меня есть словарь, который мне нужно преобразовать в массив, но не может завершить реализацию.Получить массив из словаря значений

Словарь значений в InterfaceController ...

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



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

    if let tColorValue = userInfo["TeamColor"] as? String, let matchValue = userInfo["Matchup"] as? String { 
     receivedData.append(["TeamColor" : tColorValue , "Matchup" : matchValue]) 

     let eventsList = Event.eventsListFromValues(receivedData) 

     for eventM in eventsList { 
      NSLog("Event Match: %@", eventM.eventMatch) 
     } 

    } else { 
     print("tColorValue and matchValue are not same as dictionary value") 
    } 

} 

Процесс Словарь значений в Event классе:

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 
    } 

} 

Cant выяснить эту часть ... Используйте массив для настройки таблицы в setupTable :

func doTable() { 

      // ...get array of `match`s for use in table set up 

      // ...Then set number of Rows 
      // ...Then iterate thru the array 
        for var i = 0; i < self.rowTable.numberOfRows; i++ { 
         var row = self.rowTable.rowControllerAtIndex(i) 
         // ...setup text label 
        } 
    } 

EDIT: Для осветления

doTable получит любой из match с, которые были получены и отображать их в виде таблицы. Итак, думаю, что я должен делать, это получить массив match s, а затем использовать их, чтобы установить текстовую метку в таблице.

EDIT 2: Это то, что я до сих пор

class InterfaceController: WKInterfaceController, WCSessionDelegate { 

    class EventSO { 
     var teamColor:String! 
     var matchup:String! 

     init(dataDictionary:[String:String]) { 
      teamColor = dataDictionary["teamColor"] 
      matchup = dataDictionary["Matchup"] 
     } 
    } 

    var receivedDataSO = [Event]() 

    var tColorValueSO = "Red" 
    var matchValueSO = "someString" 

    var eventSO = EventSO(dataDictionary: ["teamColor": tColorValueSO, "Matchup": matchValueSO]) 

Раскадровка:

enter image description here

+0

Что вы хотите, 'метод doTable' делать? – Adam

+0

Я не уверен на 100%, что вы пытаетесь сделать здесь, receivedData - это набор словарей уже? Не могли бы вы прояснить? Не могли бы вы рассказать нам о том, что вы хотите делать в doTable, а также о том, что такое Event? – Scriptable

+0

@Adam Hi Adam, я добавил EDIT выше, чтобы попытаться уточнить, но в основном 'doTable' настроит мою таблицу WatchKit. Поэтому внутри 'doTable' мне нужно получить массив' match ', чтобы я смог выполнить итерацию, чтобы построить таблицу и установить текст меток. Надеюсь, это имеет смысл! Дайте мне знать, если нет - – SRMR

ответ

1

Ниже код делает некоторые предположения и привычка быть непосредственно связаны, как я не очень знакомы с WatchKit и остальной частью вашего кода.

Я не думаю, что вам действительно нужен метод eventListFromValues, я сделал это на игровой площадке в XCode.

class Event { 
    var teamColor:String! 
    var matchup:String! 

    init(dataDictionary:[String:String]) { 
     teamColor = dataDictionary["teamColor"] 
     matchup = dataDictionary["Matchup"] 
    } 
} 

var receivedData = [Event]() 

var tColorValue = "Red" 
var matchValue = "someString" 

var event = Event(dataDictionary: ["teamColor": tColorValue, "Matchup": matchValue]) 

receivedData.append(event) 

func doTable(events: [Event]) { 
    myTable.setNumberOfRows(events.count, withRowType: "someRowController") 

    for (index, evt) in events { 
      let row = myTable.rowControllerAtIndex(index) as someRowController 
      row.interfaceLabel.setText(evt.teamColor) 
    } 
} 

Таким образом, используя код выше, вы должны быть в состоянии удалить функцию eventListFromValues, и когда вы получите USERINFO создать новый объект Event от значений, полученных и добавить его в конец массива.

Функция doTable будет просто переходить по массиву и устанавливать части пользовательского интерфейса таблицы на основе данных в строке.

Так, чтобы использовать этот код в вашем конкретном случае, вы могли бы сделать что-то вроде этого:

class InterfaceController: WKInterfaceController, WCSessionDelegate { 

    var evnts = [Event]() 

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

     if let tColorValue = userInfo["TeamColor"] as? String, let matchValue = userInfo["Matchup"] as? String { 
      var event = Event(dataDictionary: ["teamColor": tColorValue, "Matchup": matchValue]) 
      events.append(event) 
      doTable() 
     } else { 
      print("tColorValue and matchValue are not same as dictionary value") 
     } 

    } 

    func doTable() { 
     myTable.setNumberOfRows(events.count, withRowType: "someRowController") 

     for (index, evt) in events { 
      let row = myTable.rowControllerAtIndex(index) as someRowController 
      row.interfaceLabel.setText(evt.teamColor) 
     } 
    } 
} 
+0

Это классно, я пытаюсь интегрировать его прямо сейчас. On 'var event = Event (dataDictionary: [" teamColor ": tColorValue," Matchup ": matchValue])' строка Я получаю сообщение об ошибке "Член экземпляра tColorValue нельзя использовать для типа InterfaceController". Любые идеи, что там происходит, чтобы исправить? (Я поместил весь код, указанный вами в классе 'InterfaceController', сообщите мне, если это было неправильно) – SRMR

+0

вы пытаетесь сделать это за пределами функции? – Scriptable

+0

Я все это делаю внутри класса 'InterfaceController', это имеет смысл? Я добавил код в EDIT 2, чтобы вы могли видеть – SRMR

Смежные вопросы