Как предотвратить 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 по умолчанию и боритесь с повторным использованием ячеек, он действительно встроен в его поведение.

попробуйте адаптировать свой код, чтобы он хорошо работал с повторным использованием ячеек, или, если это действительно невозможно, вам придется написать свое собственное представление таблицы, я думаю (но я не рекомендую это вообще)