Создание простого приложения 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()
}
Другие вопросы по тегам