Передача данных в TableViewController со Static Cells (Index out of range)


#1

Такой вопрос… Имеется Table View, которая наполняется данными переданными через протокол делегирования, далее реализуется функция didSelectRow, чтобы при нажатии на ячейку таблицы открывалась DetailTableView уже со статической таблицей. Вопрос в том, как можно передать данные из Table View с prototype cells, в таблицу с Static cells.

Эта часть кода стоит в MainViewController, т.е. где заполненная TableView

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    
    let detailCable = cables[indexPath.row]
    performSegue(withIdentifier: "DetailCable", sender: detailCable)

}

Этот код в DetailTableViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let NameCell = tableView.dequeueReusableCell(withIdentifier: "NCell", for: indexPath)
        let cable = detailCable[indexPath.row]
        NameCell.textLabel?.text = cable.NameOfCable
        return NameCell
}

Но при попытке заполнения таблицы со Static Cells (DetailTableView) вылетает ошибка, что Index out of range


#2

у тебя значит скорее всего массив detailCable пустой, поставь точку остановки и посмотри значение массива в момент остановки программы.


#3

Да, он пустой, получилось добиться, чтобы передавалась структура массива Cable в detailCable ( NameOfCable и т.д.) но данные не передаются


#4

А как вы передаете данные на второй экран?


#5

у вас тут две вещи. Первая, статическая таблица не поддерживает методы Data Source. Вторая - если это у вас весь код для передачи данных

performSegue(withIdentifier: “DetailCable”, sender: detailCable)

то вы здесь данные не передаете, а просто переходите. И sender - это не отправляемые данные, а отправитель. Обычно это self.

В таблице Details вам нужно внутри ячеек вставить лейблы или текстфилды, сделать к ним аутлеты и присваивать им значения обычным способом из принятых данных. А саму передачу данных делать тоже как обычно это делается в prepare(for segue). Метод performSegue вам вроде бы особо и нужен, потому как и так должен выполняться переход по нажатию ячейки.


#6

Вот я по такому пути и пошёл, у меня в Detail статическая табличка, с Label и TextField, но вот не получается заполнить эти TextField, а вот касаемо sender - не знал. И вылетает ошибка ещё, что Index out of range


#7

она поэтому и вылетает, что метод tableView(cellForRowAt) считает, что у вас есть данные и пытается их взять, а получает nil, отсюда index out of range. И проблема в том, что этот метод всегда будет получать nil, потому как он работает с динамической таблицей и с indexPath, а в статичной таблице этого нет. Уберите этот метод, сделайте передачу данных и просто присваивайте переданные данные в ячейки.


#8

еще одна интересная деталь насчет tableView(cellForRowAt) и динамической таблицы. Дело в том, что этот метод вначале берет индекс самой таблицы, потом с этим индексом идет в массив и там берет значение по этому индексу. И получается, что индекс есть, а значения нет, отсюда собственно и index out of range.


#9

Не знал, спасибо ! А как тогда реализовать заполнение ?


#10

что имеется в виду под заполнением - передача данных из первой таблицы или присвоение в таблицу Details?


#11

вот пример присвоения уже переданных данных. Обычное присвоение

titleTextField.text = book.title
authorTextField.text = book.author


#12

Это передача данных

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         // Check segue identifier
         if segue.identifier == "GoToDetails" {
             // Take index path
             let indexPath = tableView1.indexPathForSelectedRow!            
             // Create connect with a desination VC
             let detailsViewController = segue.destination as! DetailsViewController
             // Select and pass data
             detailsViewController.item = items[indexPath]
}

#13

Именно это, спасибо буду пробовать !


#14

тут еще зависит от количества переходов. Если у вас от каждый таблицы будет свой Details, тогда будут три перехода, каждый со своим идентификатором. И тогда же при передаче данных надо проверять по условию, из какой таблицы передается, т.е. внутри одного метода будут три передачи.


#15

Если с первым разобраться, то остальные уже не будут проблемой)) Главное сигвеи переименовать ))


#16

по идее да. Good luck!