Swift: текстовые элементы таблицы - как задавать значения одному ссылаясь на значения в другом?
Помогите пожалуйста решить задачку!
Есть view, в нём создан tableView, в котором определённое количество проиндексированных через extention ячеек.
В каждый ячейке есть её номер, label и ещэ один label. Есть отдельно созданный Root, там есть массив, из которого берём данные тоже. И есть куча формул, просчитывающие значения для отдельных переменных, значения которых надо разложить первый label по порядку, в соответствии с номерами. Поняла только как всё оформить и показать во вью. А как теперь соединить это всё?
class YearsViewController: UIViewController {
private let fileReadManager = FileReaderManager()
var peremennaya = ""
// и таких переменных 76 штук
@IBOutlet weak var secondTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Здесь включается метод из модели и под каждую переменную отрабатываются свои расчёты
}
let identifier = "BirthCell"
let array = ["0", "1-2", "2-3", "3-4", "5", "6-7", "7-8", "8-9", "10", "11-12", "12-13", "13-14", "15", "16-17", "17-18", "18-19", "20", "21-22", "22-23", "23-24", "25", "26-27", "27-28", "28-29", "30", "31-32", "32-33", "33-34", "35", "36-37", "37-38", "38-39", "40", "41-42", "42-43", "43-44", "45", "46-47", "47-48", "48-49", "50", "51-52", "52-53", "53-54", "55", "56-57", "57-58", "58-59", "60", "61-62", "62-63", "63-64", "65", "66-67", "67-68", "68-69", "70", "71-72", "72-73", "73-74", "75", "76-77", "77-78", "78-79", "80"]
extension UIViewController: UITableViewDataSource, UITableViewDelegate {
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
let number = array[indexPath.row]
cell.textLabel?.text = number
return cell
}
}
Теперь условно говоря нужно, чтобы например в первой ячейке по её number в label отображалось соответствующее значение переменной. Я так понимаю, нужно эти 76 переменных уложить в массив, только куда его вставить в коде? и вопрос как обратиться к этому label? И к ещё одному? Потому что последний берёт своё значение из fileReadManager (там словарь, и если label = item id, то второй label - item value)
Не понимаю, как вообще их указать, эти тексты? Вообще не могу найти вразумительной информации, везде максимум одно значение и различные функции, а тут получается три. Что посоветуете попробовать?
PS - этот fileReadManager используется во всей программе, этот механизм уже отработан, там всё работает. Вопрос куда передавать значение? Как их передавать? Help
ДОПОЛНЕНИЕ
guard let root = fileReadManager.fetchDescription() else{
return
}
let dataSource = root.health
for item in dataSource {
if item.id == labelOneText {
healthRootOneText = item.value
}
let dataSource = root.health
for item in dataSource {
if item.id == labelTwoText {
healthRootTwoText = item.value
}
let dataSource = root.health
for item in dataSource {
if item.id == labelText {
healthRootThreeText = item.value
chakraFirstEnergyLabel.text = labelOneText
chakraSecondEnergyLabel.text = labelTwoText
chakraThirdEnergyLabel.text = labelText
Ответы (1 шт):
В общем случае вам нужно соотнести и связать данные в массиве и словаре, сейчас у вас как я понял они по отдельности и выглядят примерно так
let dict = [
"33" : "text1",
"66" : "text2",
"99" : "text3"
]
let array = [
"0",
"1-2",
"2-3"
]
Если между ключами словаря и данными массива есть однозначное соответствие, то его нужно указать например используя структ, где category берется из массива, а остальные данные из словаря.
struct Item {
var category: String
var id: String
var value: String
}
После этого можно создать объединяющий массив, здесь он создается вручную, но можно вероятно с помощью цикла, все зависит от реализации, и уже этот массив используем при выводе или фильтруем из него нужные данные (если массив выводится не целиком)
var allItems: [Item]!
func createItems() {
allItems = [
Item(category: "0", id: "33", value: "text1"),
Item(category: "1-2", id: "66", value: "text2"),
Item(category: "2-3", id: "99", value: "text1"),
]
}
Полный пример
import UIKit
struct Item {
var category: String
var id: String
var value: String
}
class ViewController: UIViewController {
@IBOutlet weak var secondTable: UITableView!
let dict = [
"33" : "text1",
"66" : "text2",
"99" : "text3"
]
let array = [
"0",
"1-2",
"2-3"
]
var allItems: [Item]!
override func viewDidLoad() {
super.viewDidLoad()
createItems()
secondTable.delegate = self
secondTable.dataSource = self
secondTable.reloadData()
}
func createItems() {
allItems = [
Item(category: "0", id: "33", value: "text1"),
Item(category: "1-2", id: "66", value: "text2"),
Item(category: "2-3", id: "99", value: "text1"),
]
}
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return allItems.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let item = allItems[indexPath.row]
cell.textLabel?.text = item.category
// ... присваиваем другим лейблам item.id и item.value
return cell
}
}