如何防止UITableView重用自定义单元Swift

时间:2016-06-21 08:05:36

标签: ios swift uitableview

在我的应用程序中,我使用 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,由于细胞的可重复性,细胞的内容发生了变化。即:重新加载tableview后,第一个单元格的内容变为第二个单元格,并且sencond的内容变为第一个单元格!!

如何防止tableview重复使用单元格?!

感谢。

4 个答案:

答案 0 :(得分:9)

尝试为每个单元格类型使用不同的标识符,因此不要对每个单元格使用"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")

答案 1 :(得分:8)

尝试在自定义单元格中实现'yyyy-mm-dd'方法,并将所有字段文本设置为nil。

prepareForReuse

希望这个帮助

答案 2 :(得分:1)

你不应该阻止这种情况,但如果你真的想这样做,我认为不设置你的UITableViewCell小区标识符应该可以解决问题。当您致电dequeueReusableCellWithIdentifier时,它将找不到任何单元格并将创建一个新单元格。但同样,不推荐使用UITableView,因为它可以与重用功能一起使用。

此外,正如@Fonix建议的那样,为UITableView的每个单元格使用不同的单元格标识符可能会在保持使用单元格重用系统的同时解决您的问题。

修改: 当您正在谈论丢失UITextField中的文本内容时,可能需要进行的一项更改是将@propery weak属性更改为strong

希望这有帮助。

答案 3 :(得分:0)

不要使用默认的UITableView并对抗细胞的重复使用,它实际上已经嵌入了它的行为。

尝试调整您的代码,以便它可以很好地重复使用单元格,或者如果这真的不可能,我猜你必须编写自己的自定义表格视图(但我不建议根本就没有了)