Как подключить данные к массивам для использования в TableView

Я пытаюсь подключить данные, выдаваемые фильтрами Realm. Я не могу и получаю ошибку при попытке.

Я попытался определить вывод «питание» как строку, целое число и число с плавающей запятой.

Вот мой код:

import UIKit
import RealmSwift

class SecondViewController: UIViewController, UITableViewDataSource {

    var localNumNutrition: Int = 0
    var localNumFoodType: Int = 0
    var localNutrition: String = ""
    var localFoodType: String = ""
    var nutritionRealmData = ["Energ_Kcal", "Protein_g", "Fiber_TD_g", "Sugar_Tot_g", "Calcium_mg", "Iron_mg", "Sodium_mg", "Vit_D_IU", "Cholestrl_mg"]

    func localizeInput() {
        localNumNutrition = numNutrition
        localNumFoodType = numFoodtype
        localNutrition = nutrition
        localFoodType = foodtype
    }

    let testItems = ["Item A: protein", "Item B", "Item C"]
    //var displayItems: [String] = ["No Values: 00.00"]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return testItems.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell")
        cell.textLabel?.text = testItems[indexPath.row]

        return cell

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        localizeInput()

        // Do any additional setup after loading the view, typically from a nib.

        /**Realm
        let realm = try! Realm()
        print(Realm.Configuration.defaultConfiguration.fileURL)
        Bundle.main.path(forResource: _, ofType:)
        */

        func setDefaultRealmForUser(username: String) {
            var config = Realm.Configuration()

            // Use the default directory, but replace the filename with the username
            config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm")

            // Set this as the configuration used for the default Realm
            Realm.Configuration.defaultConfiguration = config
        }

        let config = Realm.Configuration(
            // Get the URL to the bundled file
            fileURL: Bundle.main.url(forResource: "NutritionData", withExtension: "realm"),
            // Open the file in read-only mode as application bundles are not writeable
            readOnly: true)

        //print(config)
        //print(Realm.Configuration.defaultConfiguration.fileURL)

        // Open the Realm with the configuration
        let realm = try! Realm(configuration: config)

        localNutrition = nutritionRealmData[localNumNutrition]

        // Read some data from the bundled Realm
        let results = realm.objects(NutritionData.self).filter("App_Food_Pyramid_Category  = " + String(localNumFoodType)).sorted(byKeyPath: localNutrition, ascending: false)
        let nutritionValuesResults = results.value(forKeyPath: localNutrition)
        let shortDesc = results.value(forKeyPath: String("Shrt_Desc"))
        //print(results)
       // print(shortDesc)
       // print(nutritionValuesResults)

        /*
        for (let i = 0; results.length - 1; i++) {
            let item = results[i];
        }
        */
        var itemCount: Int = 0
        for item in results {
            itemCount = itemCount + 1
            if itemCount < 10 {
                let desc = String(item.Shrt_Desc!)
                let nutritionValue = item.value(forKeyPath: localNutrition) **These are the 2 outputs**

                //let stringNutritionValue = NSNumber(nutritionValue)
                let displayItems = [(String(desc) + String(nutritionValue)] **Trying to join them to get a single output.**

                //print(displayItems)

                print(desc)
                print(nutritionValue)
            }
        }

        //print(item)

        /*
        var iterator = results.makeIterator()
        let NutritionDataNext = iterator.next()
        print(next)
        */

        navigationController?.navigationBar.prefersLargeTitles = true

    }


}

Я пытаюсь объединить desc (описание) и NutritionValue (десятичное число) в один массив для использования в качестве данных для табличного представления. Я пытаюсь, чтобы данные отображались как выходные данные desc: NutritionValue.

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

Anirudha Mahale 09.04.2019 06:43

Я не вижу, где вы инициализируете источник данных табличного представления. Вы поставили точку останова, чтобы увидеть, вызываются ли ваши методы источника данных?

Ron 09.04.2019 06:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

// Realm Object
class NutritionData: Object {
    @objc dynamic var desc = ""
    @objc dynamic var nutritionValue = 0.0

    // Setting data to realm object
    func setAllProperties(_ desc: String, value: Double) {
        self.desc = desc
        self.nutritionValue = value
    }
}


class SecondViewController: UIViewController, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var testItems = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        testItems = getData()
        tableView.reloadData()
    }

    func saveData() {
        let realm = try! Realm()
        try! realm.write {
            let object = NutritionData()
            object.setAllProperties("Some description", value: 10.5)

            // Saving the realm object to local database.
            realm.add(object)
        }
    }

    func getData() -> [String] {
        // retrieving the saved data with filter.
        let data = Realm().objects(NutritionData.self).filter("nutritionValue == 10.5")

        // mapping the realm's result to desired object.
        let strings = data.map { item: NutritionData -> String
            return "\(item.desc): \(item.nutritionValue)"
        }

        // Returning the data to populate in the tableView.
        return strings
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return testItems.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell")
        cell.textLabel?.text = testItems[indexPath.row]
        return cell
    }
}
Ответ принят как подходящий

Добавление nameOfVariable = titleRow к каждому оператору if и if-else в функции titleForRow устанавливает вывод в эту переменную. Ниже приведен отредактированный код для устранения проблемы:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == nutritionUIPickerView {
            let titleRow = nutritionPickerData[row]

            nutrition = titleRow

            return titleRow
        } else if pickerView == foodTypeUIPickerView {
            let titleRow = foodTypePickerData[row]

            foodtype = titleRow

            return titleRow
        }

        return ""

    }

Другие вопросы по теме