2016-03-16 2 views
-1

Я использую WatchConnectivity для отправки массива строковых значений с iPhone на Watch, но при этом я получаю следующую ошибку.Как отправить массив для просмотра с помощью sendMessage | Ошибка: не удалось передать значение типа «__NSCFArray» в «NSString»

Could not cast value of type '__NSCFArray' (0x591244) to 'NSString' (0x9f7458).

У меня были некоторые незначительные проблемы с отправкой массива строк в словаре на часы, а затем сохранить массив для использования в WKInterfaceTable.

Кто-нибудь знает, где я ошибаюсь, и как я могу отображать массив на часах?

iPhone

После получения первого сообщения от часов, чтобы отправить данные на айфоны didRecieveMessage выполняют следующие действия.

Существует массив, называемый objectsArray, и каждый объект имеет свойство string, которое называется title. Я создаю новый массив для всех значений title и использую массив в словаре для отправки на часы.

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

    var watchArray = [""] 

    for object in self.objectsArray { 
    watchArray.append(object.title) 
    } 

    print("Received message from watch and sent array. \(watchArray)") 
    //send a reply 
    replyHandler([ "Value" : [watchArray] ]) 

} 

Часы

var objectTitlesArray = ["String"] 


//Display Array in WKInterfaceTable 

func loadTableData() { 
    table.setNumberOfRows(self.tasks.count, withRowType: "CellRow") 
    if self.tasks.count > 0 { 
     for (index, objectTitle) in self.objectTitlesArray.enumerate() { 
      let row = self.table.rowControllerAtIndex(index) as! CellRowController 
      row.tableCellLabel.setText(objectTitle) 
     } 
    } 
} 


//Saving the Array 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

    let value = message["Value"] as! [String] 

    dispatch_async(dispatch_get_main_queue()) { 
     self.objectTitlesArray = value 
     print("Received Array and refresh table") 
     loadTableData() 
    } 

    //send a reply 
    replyHandler(["Value":"Yes"]) 

} 

UPDATE

ошибка упоминалось, кажется, что-то делать с действием обновления при установке текста метки для значения. Однако после комментирования строк, массив по-прежнему не отображается в WKInterfaceTable, и ни один из операторов печати не выводится на консоль.

ответ

0

sendMessage мето d должен обрабатывать ответ с телефона. И их нет оснований использовать метод didRecieveMessage на часах, если iPhone не использует метод sendMessage.

@IBAction func fetchData() { 

    let messageToSend = ["Value":"Hello iPhone"] 
    session.sendMessage(messageToSend, replyHandler: { replyMessage in 

     if let value = replyMessage["Value"] { 
       self.objectTitlesArray = value as! [String] 
       self.loadTableData() 
     } 

     }, errorHandler: {error in 
      // catch any errors here 
      print(error) 
    }) 

} 
0

Это где происходит ошибка:

let value = message["Value"] as! [String]

В выше, вы получаете Value собственность в message словаря и явно разливка как String. Оно должно быть следующим:

if let value = message["Value"] { 

    dispatch_async(dispatch_get_main_queue()) { 
     self.objectTitlesArray = value as! [String] 
    } 
} 

Как и в сторону, похоже, вы также обертывание массив строк в другой, избыточный массив:

replyHandler([ "Value" : [watchArray] ])

Если вы просто хотите отправить массив строк, то следующий должен хватить:

replyHandler([ "Value" : watchArray ])

+0

При изменении литья значения значения для '[массива]' Я получаю следующее сообщение об ошибке 'Неоднозначности ссылка на член«Индекс»', когда я оставил его как '[String]' и просто изменить обработчик ответа на телефон, то я все еще получаю ту же ошибку, упомянутую в моем вопросе. – RileyDev

+0

См. Обновленный ответ. –

+0

К сожалению, все еще получаю 'Неоднозначная ссылка на член 'Subscript'' :( – RileyDev