#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 ""
}