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

#swift

#swift

Вопрос:

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

Я попытался определить выходные данные «nutrition» в виде строки, int и float .

Вот мой код:

 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 (description) и nutritionValue (decimal) в один массив для использования в качестве данных для табличного представления. Я пытаюсь получить данные, которые будут отображаться как выходные данные desc: nutritionValue .

Комментарии:

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

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

Ответ №1:

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

 // 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
    }
}
  

Ответ №2:

Добавление 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 ""

    }