UITableViewCell dequeuereusablecellwithidentifier возвращает ту же ячейку - PullRequest
0 голосов
/ 28 ноября 2018

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

enter image description here

Когда пользователь нажимает кнопку «+», я хотел бы добавить новую ячейку с UITextField дляввод данных.Эта новая ячейка представляет собой Custom UITableViewCell, который называется «RecordValueCell».Вот как это выглядит:

enter image description here

//Custom UITableViewCell
class RecordValueCell : UITableViewCell {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var deleteButton: UIButton!

    var onButtonTapped : ((_ sender : UIButton)->Void)?

    @IBAction func deleteButtonTouched(_ sender: Any) {
        guard let senderButton = sender as? UIButton else {
            return
        }
        onButtonTapped?(senderButton)
    }
}

Однако, когда я пытаюсь добавить другую ячейку, используя функцию tableView.dequeueReusableCell(withIdentifier: ), кажется, она возвращаетта же клетка.Вот как выглядит мой пользовательский интерфейс:

enter image description here

Пустое место в верхней части раздела, где должна быть моя новая ячейка.Вот код для добавления ячейки:

func addNewValueCell() {
    guard let reusableValueCell = self.tableView.dequeueReusableCell(withIdentifier: "valueCell") as? RecordValueCell else {
        fatalError("failed to get reusable cell valueCell")
    }

    var cell = Cell() //some custom cell Object
    //add the gray horizontal line you see in the pictures
    reusableValueCell.textField.addBorder(toSide: .Bottom, withColor: UIColor.gray.cgColor, andThickness: 0.5)

    reusableValueCell.onButtonTapped = { (sender) in
        self.removeValue(sender: sender)
    }

    cell.cell = reusableValueCell
    self.sections[self.sections.count - 1].cells.insert(cell, at: 0)

    //When i put a break point at this spot, i find that reusableValueCell is the same object as the cell that is already being used.
    tableView.reloadData()

    reusableValueCell.prepareForReuse()
}

Когда я отлаживаю его, я обнаруживаю, что dequeueReusableCell(withIdentifier: ) возвращает один и тот же RecordValueCell несколько раз.

Вот мой cellForRowAt:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = self.sections[indexPath.section].cells[indexPath.row].cell else {
        fatalError("error getting cell")
    }

    return cell
}

numberOfRowsInSection

 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.sections[section].cells.count
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Эта функция очень проста в реализации, если вы будете делать это хорошо.

Сначала вам нужно создать две TableCell.Сначала, чтобы дать возможность добавить запись с помощью кнопки плюс, а затем для ввода значения с текстовым полем.Теперь всегда возвращайте первую ячейку (AddRecordTableCell) в последней строке в tableView и возвращайте количество строк в соответствии с введенными значениями, такими как

return totalValues.count + 1

0 голосов
/ 28 ноября 2018

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

tableView.dataSource = self // view controller that contains the tableView

Создать массив строк в качестве члена вашей таблицы.Класс View Controller, который содержит данные для каждой ячейки:

var strings = [String]()

Затем вам нужно будет реализовать следующий метод для протокола UITableViewDataSource:

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

YouТакже следует удалить из очереди ячейки в вашем методе cellForRowAt следующим образом:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: yourIdentifier) as! YourCellClass
    cell.textLabel = strings[indexPath.row]
    return cell   
}

Тогда каждый раз, когда пользователь входит в textField, его ввод будет добавляться в этот массив:

let input = textField.text strings.append(input) tableView.reloadData()

После перезагрузки данных ячейка будет автоматически добавлена ​​в таблицу, поскольку количество строк определяется длиной массива String, а метка устанавливается в методе cellForRowAt.

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