Как использовать insertRowsAtIndexPath() с несколькими пользовательскими ячейками-прототипами?

У меня есть следующая настройка в моем UITableView:

  • Ячейка прототипа 1 = всегда видна, имеет 1 строку, содержащую UITextField (ввод которой приведет к появлению/исчезновению других ячеек) и несколько меток.
  • Ячейка прототипа 2 = появляется на основе ввода, 1 строка с изображением объекта
  • Ячейка прототипа 3 = появляется на основе ввода, 1 строка с меткой объекта
  • Ячейка прототипа 4 = появляется на основе ввода, количество строк на основе массива в объекте

Итак, у меня есть объект, который содержит изображение (для одной строки в ячейке 2), имя (для одной строки в ячейке 3) и массив (для нескольких строк в ячейке 4).

Основываясь на входных данных в ячейке-прототипе 1, мне нужно заполнить и показать ячейки 2, 3 и 4. Все данные в этих новых ячейках поступают из одного объекта, который был выбран путем ввода чего-то в UITextfield из первой ячейки.

Но я не могу понять, где и как реализовать следующий метод для создания новых строк/ячеек:

tableView?.insertRows(at:[IndexPath(row: 1, section: 0)], with: .automatic)

Мне нужно было бы использовать его, чтобы вставить 1 строку в ячейку прототипа 2, чтобы вставить 1 строку в ячейку прототипа 3 и несколько строк в ячейку прототипа 4.

И помощь будет принята с благодарностью.


person Aovib    schedule 26.10.2016    source источник
comment
Вы должны добавить свою логику для ячеек прототипа в методе cellForRowAtIndexPath.   -  person KrishnaCA    schedule 26.10.2016


Ответы (1)


Я считаю, что inserRows() не лучший способ сделать это.

Вы можете использовать cellForRowAtIndexPath, и вам нужно обновить данные, вы можете перезагрузить всю таблицу с помощью reloadData() или reloadRowsAtIndexPaths()

 override func tableView(tableView: UITableView!,  
    cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        if indexPath.row == 1 { 
            var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell1 ") as YourTableViewCell
        return cell
        }
        else if indexPath.row == 2 { 
            var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell2 ") as YourTableViewCell
         return cell
        }
        //do this to maintain the same cells at position 1..4 and for the rest of the rows
        else {
           var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell5 ") as YourTableViewCell
           return cell
        }

    }
person kileros    schedule 26.10.2016
comment
Причина, по которой я хотел бы попробовать функцию insertRows(), заключается в том, что мне нужны 3 новые ячейки для анимации. Использование reloadData() также ошибочно обновит первую (всегда видимую) ячейку. В то время как reloadRowsAtIndexPaths() выдал мне неуказанную ошибку. Меня также смущает, где я буду устанавливать фактические данные, которые поступают в ячейки... Я более подробно объяснил всю проблему здесь: [ссылка] (stackoverflow.com/ вопросы/40259423/) - person Aovib; 26.10.2016
comment
Вы можете попробовать изменить UITableViewController и поместить UIView вместо первой строки, а другие строки будут внутри UITableView и вместо использования heightForRowAt для скрытия и отображения ячеек используйте флаги внутри cellForRowAtIndexPath, чтобы показать правильную ячейку и использовать перезагрузить данные() - person kileros; 26.10.2016