Хобрук: Ваш путь к мастерству в программировании

Объект результатов области с неверными результатами (iOS, Swift)

У меня возникают проблемы с правильным доступом к объекту результата Realm с помощью cellForRowAt UITableView.

Вот настройка:

UITableViewController разделен на разделы в зависимости от категории объектов (строка, определенная в объекте).

UITableViewController имеет переход к UIViewController, который принимает ввод формы. Этот контроллер представления записывает в Realm, а затем выполняет обратный вызов через делегирование, чтобы обновить данные табличного представления.

Когда этот экран закрывается и возвращается к UITableViewController, когда я пытаюсь добавить строку через категорию, я получаю пустые объекты. Однако, когда я использую цикл for внутри cellForRowAt, я могу получить доступ к данным.

Вот что я запускаю в этом разделе:

func loadItems() {
        itemsList = try! Realm().objects(Items.self).filter("list_id = \(list_id)").sorted(byKeyPath: "item_category")
        tableView.reloadData()

    }    

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "itemListCell", for: indexPath)
        let categoryName = categories.categories[indexPath.section]

        let currItem = itemsList[indexPath.row]

        if currItem.item_category == categoryName {
            cell.textLabel!.text = currItem.item_name
        }

        return cell
    }

Кажется, что он правильно оценивает категорию и входит в этот блок, но item_name и item_category объекта имеют значение null. Вот скриншот отладчика внутри оператора if:

Изображение отладчика

Есть ли что-то, что мне нужно изменить в том, как я использую объект, извлекаю данные и т. Д., Чтобы получить правильные данные в объекте?

10.10.2019

Ответы:


1

Нашел мой ответ здесь: UITableView с несколькими разделами с использованием Realm и Swift

Это изменение, которое я внес в cellForRowAt:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "itemListCell", for: indexPath)

        let currItem = itemsList.filter("item_category = '\(categories[indexPath.section])'")[indexPath.row]
        cell.textLabel!.text = currItem.item_name

        return cell
    }

Проблема, с которой я столкнулся, заключалась в том, что я постоянно вытягивал объект результатов первой позиции, а не первую позицию в разделе. Мне нужно было сузить до моей секции, а затем вытащить первый ряд.

10.10.2019

2

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

itemsList = try! Realm().objects(Items.self).filter("list_id = \(list_id)").sorted(byKeyPath: "item_category"

к этому

itemsList = try! Realm().objects(Items.self).filter("list_id = '\(list_id)'").sorted(byKeyPath: "item_category"

Добавьте одинарные кавычки вокруг '(list_id)'.

Фильтрация областей

10.10.2019
  • На самом деле, нашел ответ здесь: stackoverflow.com/questions/38728938/ Похоже, мне нужно отфильтровать в CellForRowAt категорию в разделе, а затем вытащить indexPath.row. Проблема заключалась в том, что у меня был двухмерный массив, но я всегда вытягивал то, что было indexPath равным 0, несмотря ни на что. Это меня смущало. 10.10.2019
  • @bwor80 bwor80 Если вы нашли ответ и у вас есть рабочий код, включите его в свой код, чтобы он мог помочь другим! 10.10.2019
  • Новые материалы

    Еженедельный выпуск React 75
    Добро пожаловать в 75-й выпуск React Weekly, еженедельный обзор последних ссылок и руководств по React и React Native. Посетите Купить кофе , чтобы найти способы поддержать React Weekly, или..

    (Почти) полнофункциональная реализация Gumbel MuZero в Джулии.
    TLDR; Gumbel Muzero — это современный алгоритм обучения с подкреплением. Он достиг сверхчеловеческой производительности во многих настольных играх и даже, что более впечатляюще, в Atari..

    Передача нейронного стиля в браузерах с использованием Angular и WebDNN
    В последние годы глубокое обучение привлекло большое внимание из-за его безупречной производительности при обучении на обширных данных и высокой точности при выводе. Развертывание этих алгоритмов..

    Шифр Цезаря в C
    Шифр Цезаря  — один из самых простых и широко известных методов шифрования. Он включает в себя сдвиг каждой буквы в сообщении на определенное количество позиций в алфавите. В этой статье мы..

    Исследовательский анализ данных (EDA)
    Что такое ЭДА? Анализ данных, который ищет закономерности в данных, известен как исследовательский анализ данных. Это похоже на беглый просмотр данных, чтобы найти наиболее важные..

    1x1 Convolution: демистификация
    Чтобы пролить свет на концепцию операции свертки 1x1, которая представлена ​​в статье «Сеть в сети» Лин и др. и Google Inception Некоторое время назад я прочитал статью «Сеть в сети» (NiN),..

    Лучшие расширения VS Code в 2022 году
    Код ВС Лучшие расширения VS Code в 2022 году Список самых полезных расширений VS Code, которые вы можете использовать как разработчик в 2022 году Расширения находятся на рынке VS Code,..