Есть 3 кастомные ячейки. Как передать их всех в таблицу и обновить ее ?


#1

Привет товарищи! У меня есть tableView, которая ищет информацию по апи. При выборе информация открывается другой TableViewController с кастомными 3мя ячейками. Вопрос в следующем:
Как передать информацию с 1ого tableViewController’a во 2й tableViewController(с кастомными ячейками) ? + Создал я 3 кастомные ячейки. Одну кастомную ячейку я передал в TableViewController(который принимает в себя информацию с первого). Далее код 2ого TableViewController’a:
@IBOutlet weak var weatherTable: UITableView!

var weatherList = [Weather]()

override func viewDidLoad() {
    super.viewDidLoad()
    let nibb = UINib.init(nibName: "CustomTableViewCellTwo", bundle: nil)
    let nibbb = UINib.init(nibName: "CustomTableViewCellThree", bundle: nil)
    let nib = UINib.init(nibName: "CustomTableViewCell", bundle: nil)
    self.weatherTable.register(nib, forCellReuseIdentifier: "CustomTableViewCell")
    self.weatherTable.register(nibb, forCellReuseIdentifier: "CustomTableViewCellTwo")
    self.weatherTable.register(nibbb, forCellReuseIdentifier: "CustomTableViewCellThree")
}

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

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
    cell.nameWeather.text = weatherList[indexPath.row].strWeather
    cell.imageWeather.image = #imageLiteral(resourceName: "WeatherDetails")
    
    return cell
}

}

Как тут еще привязать 2 кастомные ячейки и передать туда другие данные?

P.S код в первом tableViewController’e стандартный(функции запроса и вывода информации)


#2

В методе создания ячейки парсите приходящих indexPath. И для нужного диапазона возвращайте нужный тип ячейки.


#3

Как обновить вторую таблицу с данными из первой ?


#4

Допустим данные для отображения вы кое-как передали.
Далее вам нужно определиться в каком формате данные будут отображаться, Это нужно для определения кол-ва ячеек в таблице. Если данные переданы в виде массива объектов и каждый объект будет выводиться в своей ячейке, тогда кол-во ячеек = кол-во объектов в массиве.
Но у вас имеется 3 разных вида ячейки, значит вам нужно данные делить на свои ячейки.
Это уже делаете либо самым простым способом в лоб, в методе cellForRowAt проверяете какая ячейка подошла (indexPath.row) и для нее указываете в dequeueReusableCell соответствующий ID ячейки. После чего заполняете ячейку данными и возвращаете ячейку.
Либо передаете данные уже сформированные в определенную структуру, в которой так же можно указать тип ячейки и тогда будет проще с этим работать.


#5

Я с вами согласен, в этом и была задумка. Я сделал 3 кастомные ячейки, чтобы передать в них 3 вида информации(Тоесть при при клике на первой tableView перехожу на 2ую с кастомными ячейками и там выводится инфа в одну строчку в каждой ячейке). Одну ячейку как вы видите я присоединил и заполнил(CustomTableViewCell). Но я не могу разобраться как 2 другие присоединить. (Допустим CustomTableViewCellTwo и CustomTableViewCellThree )


#6

Я сказал, нужно следить за indexPath.row и на основании этого подставлять нужную ячейку.


#7

Понял, благодарю!!!


#8

С ячейками разобрался, как теперь передать в эти ячейки данные из первого tableView ?


#9

Как вы открываете второй VC?


#10

По нажатию ячейки из первого tableViewC, идет переход во 2й tableViewC(куда я должен передать информацию с первого)


#11

Я имел в виду каким способом: сигвей, кодом?


#12

Сигвей…


#13

Тогда смотрите на метод prepare(for segue:...)
В нем можно подготовить все данные для передачи и передать.


#14

Передал таким образом:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showMore" {
            if let destination = segue.destination as? DetailSearchViewController {
                destination.weather = weatherList[weatherSearchTableView.indexPathForSelectedRow?.row ?? 1]
            }

вот код со второго tableView:

if indexPath.row < 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.indetifier, for: indexPath) as? CustomTableViewCell
        cell?.nameWeather.text = weather?.strList
        cell?.imageWeather.image = #imageLiteral(resourceName: "WeatherDetails")
        
        return cell!

Ошибок нету, но при тесте, везде нил, почему? Ведь вроде правильно передал…


#15

Вы в качестве индекса указываете indexPathForSelectedRow, но если вы в методе didSelectItemAt делаете deselect, тогда этот индекс nil.
Вы можете в методе didSelectItemAt передавать вторым параметром индекс нажатой ячейки, тогда в методе prepare вы его получите, проверите что там пришло число и по нему вытащите ваши данные из массива.