Как заполнить таблицу двумя массивами, используя одну ячейку? - PullRequest
2 голосов
/ 21 июня 2019

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

FirstArray и SecondArray.в ячейке табличного представления есть две метки Lbl1 и Lbl2 , теперь Lbl1 должны заполниться FirstArray и Lbl2 Следуетзаполните SecondArray .Я знаю, что мы не можем использовать два массива для источника данных uitableview.Я не могу понять, как это сделать.

Пожалуйста, помогите мне.

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

У меня есть два массива -

let datalist1 = ["firstCell1" , "firstCell2" , "firstCell3" , "firstCell4"]
    let datalist2 = ["secondCell1"  ,"secondCell2" , "secondCell3" ,"secondCell4"]

В табличном номере numberOfRowsInSection:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if section == 0
        {
            return datalist1.count
        }
        else  {
            return datalist2.count
        }
    }

В cellForRowAt:

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

        if indexPath.section == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as? FirstCell
            cell?.initData(name: datalist1[indexPath.row])
            return cell!
        }
        else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as? SecondCell
            cell?.initData(lbl: datalist2[indexPath.row])
            return cell!
        }

    }

Фактический выход:

FirstCell1 FirstCell2 FirstCell3 FirstCell4 SecondCell1 SecondCell2 SecondCell3 SecondCell4

Ожидаемый выход:

FirstCell1CellCell1CellFirstCell2 SecondCell2 FirstCell3 SecondCell3 FirstCell4 SecondCell4

Ответы [ 5 ]

1 голос
/ 21 июня 2019

Здравствуйте. Вам не нужно добавлять два section, как показано ниже. Это ваши массивы.

let datalist1 = ["firstCell1" , "firstCell2" , "firstCell3" , "firstCell4"]
let datalist2 = ["secondCell1"  ,"secondCell2" , "secondCell3" ,"secondCell4"]

Количество рядов

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return datalist1.coun
}

Ячейка для строки

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as? FirstCell
    cell.Lbl1.text = datalist1[indexPath.row]
    cell.Lbl2.text = datalist2[indexPath.row]
    return cell!
}
1 голос
/ 21 июня 2019

На основании предоставленного вами объяснения и кода требование не ясно.Однако могут быть два случая, основанные на вышеупомянутых деталях:

Случай 1:

Ячейка-1: FirstCell1

Ячейка-2:SecondCell1

Ячейка-3: FirstCell2

Ячейка-4: SecondCell2

Затем вы можете реализовать что-то вроде следующего:

В номере табличного представленияOfRowsInSection:

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

В cellForRowAt:

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

    if indexPath.row % 2 == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as? FirstCell
        cell?.initData(name: datalist1[indexPath.row])
        return cell!
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as? SecondCell
        cell?.initData(lbl: datalist2[indexPath.row])
        return cell!
    }

}

Case-2:

Cell-1: FirstCell1 SecondCell1

Cell-2:FirstCell2 SecondCell2

Ячейка-3: FirstCell3 SecondCell3

Ячейка-4: FirstCell4 SecondCell4

Затем вы можете реализовать что-то вроде следующего:

В числе табличных представленийOfRowsInSection:

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

В cellForRowAt:

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as? FirstCell
        //Single custom cell can implement both the labels
        cell?.initData(name: datalist1[indexPath.row],lbl: datalist2[indexPath.row])
        return cell!
    }

}
0 голосов
/ 21 июня 2019

1. Создайте сингл array из datalist1 и datalist2, используя zip(_:_:), который мы будем использовать как dataSource для tableView.

lazy var dataList = Array(zip(self.datalist1, self.datalist2))

dataList имеет тип [(String, String)].

Пример:

Если datalist1 и datalist2,

let datalist1 = ["firstCell1" , "firstCell2" , "firstCell3" , "firstCell4"]
let datalist2 = ["secondCell1"  ,"secondCell2" , "secondCell3" ,"secondCell4"]

затем, dataList содержит

[("firstCell1", "secondCell1"), ("firstCell2", "secondCell2"), ("firstCell3", "secondCell3"), ("firstCell4", "secondCell4")]

2. Вам нужен один cell для отображения всех этих данных.Для этого не нужно создавать 2 разных UITableViewCells.Пример:

class CustomCell: UITableViewCell {
    @IBOutlet weak var lbl1: UILabel!
    @IBOutlet weak var lbl2: UILabel!
}

3. Теперь ваши UITableViewDataSource методы выглядят как

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    cell.lbl1.text = self.dataList[indexPath.row].0
    cell.lbl2.text = self.dataList[indexPath.row].1
    return cell
}
0 голосов
/ 21 июня 2019

Лучший способ - использовать модели.Вы должны объявить модель данных, такую ​​как

struct MyModel {
   var firstValue: String?
   var secondValue: String?
}

Затем вы должны преобразовать ваши два массива в один массив объектов MyModel

var myData = Array<MyModel>()

Затем с помощью цикла for вы можете перебиратьодин массив и заполните массив myData.

for (index, _) in datalist1 {
   let object = MyModel()
   object.firstValue = datalist1[index]
   object.firstValue = datalist2[index]
   myData.append(object)
}

Затем просто реализуйте методы протокола таблицы и заполните свою пользовательскую ячейку объектами MyModel.

0 голосов
/ 21 июня 2019

Вы должны объявить как

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

        if indexPath.section %2 == 0 {
            let cell1 = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as? FirstCell
            cell1.lbl1.text = datalist1[indexPath.row]
            return cell1!
        }
        else {
            let cell2 = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as? SecondCell            
            cell2.lbl2.text = datalist2[indexPath.row]
            return cell2!
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...