Как предотвратить UITableView от повторного использования пользовательских ячеек Swift
в моем приложении я использую UITableView С таможни клетки.
для каждой ячейки я реализую функцию для ее создания и вызываю эти функции в cellForRow.
это пример кода из проекта :
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == CellsTypes.profileImageCell.rawValue {
return createIntroCell()
}
else if indexPath.row == CellsTypes.fullNameCell.rawValue {
return createUserNameCell()
}
else if indexPath.row == CellsTypes.emailCell.rawValue {
return createEmailCell()
}
else {
return createPasswordCell()
}}
и это функции создания :
func createUserNameCell() -> TextFieldTableViewCell {
let fullNameCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell
fullNameCell.awamirTextFieldNib.setNormalTextFieldCellContent("Full Name")
fullNameCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.fullNameCell.rawValue
fullNameCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next
fullNameCell.awamirTextFieldNib.textFieldContent.delegate = self
return fullNameCell
}
func createEmailCell() -> TextFieldTableViewCell {
let emailCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell
emailCell.awamirTextFieldNib.setNormalTextFieldCellContent("Email")
emailCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.emailCell.rawValue
emailCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next
emailCell.awamirTextFieldNib.textFieldContent.delegate = self
return emailCell
}
func createPasswordCell() -> TextFieldTableViewCell {
let textFieldCell = self.tableView.dequeueReusableCellWithIdentifier("text-field-cell") as! TextFieldTableViewCell
textFieldCell.awamirTextFieldNib.setPasswordCellContent("Password")
textFieldCell.awamirTextFieldNib.textFieldContent.tag = CellsTypes.passwordCell.rawValue
textFieldCell.awamirTextFieldNib.textFieldContent.returnKeyType = .Next
textFieldCell.awamirTextFieldNib.textFieldContent.delegate = self
return textFieldCell
}
проблема в том, что если я перезагружаю tableview, содержимое ячеек изменяется из-за reusablity ячеек. я.е: после перезагрузить TableView Для в содержание первой ячейки становится во второй ячейке, а содержание sencond on становится в первой ячейке!!
Как я могу предотвратить TableView от повторного использования ячеек?!
спасибо.
4 ответов
попробуйте использовать другой идентификатор для каждого из типов ячеек, поэтому не используйте "text-field-cell"
для каждого из них сделайте одно "полное имя", "пароль" и т. д. не уверен, как вы собираетесь создавать свои ячейки, но если вы используете registerNib или registerClass, вам нужно будет зарегистрировать его для каждого другого идентификатора
self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "full name")
self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "password")
self.tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "email")
попробуйте реализовать prepareForReuse
метод в пользовательской ячейке и установите для всех полей text значение nil.
override func prepareForReuse() -> Void {
awamirTextFieldNib.text = nil
}
надеюсь, что это поможет
вы не должны предотвращать это, но если вы действительно хотите, я думаю, что не устанавливать идентификатор ячейки для вашего UITableViewCell
следует сделать трюк. Когда ты позвонишь dequeueReusableCellWithIdentifier
, он не найдет ячейки и создаст новую. Но опять же, это не рекомендуется как UITableView
сделано быть использованным с способностью повторного пользования.
кроме того, как предлагает @Fonix, используя другой идентификатор ячейки для каждой ячейки вашего UITableView
может решить вашу проблему, сохраняя при этом использование системы повторного использования ячейки.
Edit:
Поскольку вы говорите о потере текстового содержимого в вашем UITextField, возможно, единственное изменение, которое нужно сделать, - это изменение вашего @propery до strong
.
надеюсь, что это помогает.
Не используйте UITableView по умолчанию и боритесь с повторным использованием ячеек, он действительно встроен в его поведение.
попробуйте адаптировать свой код, чтобы он хорошо работал с повторным использованием ячеек, или, если это действительно невозможно, вам придется написать свое собственное представление таблицы, я думаю (но я не рекомендую это вообще)