Создание простого приложения HomeKit из учебника и получение ошибок при добавлении HMAccessory
Я следую этому уроку:
http://www.xmcgraw.com/learn-how-to-create-an-ios-app-using-homekit/
В статье есть ссылка на GitHub с кодом.
Я пытаюсь запустить простое приложение HomeKit, чтобы включить и выключить свет. Я прочитал руководство Apple по началу работы с HomeKit. У меня есть платное членство в Apple для разработчиков, и профиль обеспечения позволяет мне создавать приложение и запускать его на моем iPhone (6s с iOS 10.2). Я использую Xcode 8.2.1, и у меня работает HomeKit Accessory Simulator, и я вижу созданные имитированные источники света, потому что могу распечатать их на консоли, все они отображаются по имени.
Проблема в том, что я не могу добавить их в массив аксессуаров и добавить их в табличное представление в виде ячеек. Я проверил и повторно проверил, что идентификатор повторного использования "accessoryId" в моих ячейках соответствует тому, что я использую в своем коде.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "accessoryId") as UITableViewCell? {
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "accessoryId")
let accessory = accessories[indexPath.row] as HMAccessory
cell.textLabel?.text = accessory.name
return cell
}
return UITableViewCell()
}
Я просмотрел много других вопросов по SO, касающихся той же ошибки, и ни одно из исправлений не помогло.
После того, как accessories.append(аксессуар) закомментирован, функция печати будет корректно записывать все имена найденных аксессуаров из симулятора.
func accessoryBrowser(_ browser: HMAccessoryBrowser, didFindNewAccessory accessory: HMAccessory) {
print(accessory.name)
accessories.append(accessory)
tableView.reloadData()
}
но когда я раскомментирую аксессуары.append (аксессуар), я получаю эту ошибку
UITableView... не удалось получить ячейку из источника данных "
Как я могу решить это?
1 ответ
Эта строка не имеет смысла для меня:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "accessoryId")
Вы регистрируете ячейку для таблицы внутри cellForRowAtIndexPath и каждый раз, когда она вызывается. Попробуйте поставить его в viewDidLoad. Но я думаю, что вам вообще не нужно этого делать, если вы используете раскадровки.
И в этом есть синтаксис в Swift 3 (название вашего вопроса говорит, что вы используете это):
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "accessoryId") {
// OR for Custom Cell:
// if let cell = tableView.dequeueReusableCell(withIdentifier: "accessoryId") as? CustomTableViewCell {
return cell
}
return UITableViewCell()
}