Ios 如何修复swift中重复的UITableCell

Ios 如何修复swift中重复的UITableCell,ios,swift,uitableview,user-interface,tableview,Ios,Swift,Uitableview,User Interface,Tableview,我知道这里已经有一些类似的问题,但我无法让它们中的任何一个发挥作用。基本上,我有一个ui表视图,每个单元格中有一个标签和一个开关。每14个单元,开关将重复一次。开关1的状态将改变开关14、28等 这是我的密码: override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Configure the cell:

我知道这里已经有一些类似的问题,但我无法让它们中的任何一个发挥作用。基本上,我有一个ui表视图,每个单元格中有一个标签和一个开关。每14个单元,开关将重复一次。开关1的状态将改变开关14、28等

这是我的密码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // Configure the cell:

    let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell

    println(companies.count)
    cell.companyName.text = companies[indexPath.row]

    return cell
}
将31个公司名称的数组加载到单元格中:

[Apple Inc, American Express Co, ... , Exxon Mobil Corp, Dow Jones]
公司的标签名称位于单元格的左侧,开关位于单元格的右侧


那么我如何才能让这些单元停止相互重复使用呢?

这是因为您正在使用

tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell 
要避免这种情况,请重置cellForRowAtIndexPath中的开关,如

或者创建新的细胞,比如

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Configure the cell:

  let cell = CompanyCell()
  cell.companyName.text = companies[indexPath.row]

return cell
}

这是因为您正在使用

tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell 
要避免这种情况,请重置cellForRowAtIndexPath中的开关,如

或者创建新的细胞,比如

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Configure the cell:

  let cell = CompanyCell()
  cell.companyName.text = companies[indexPath.row]

return cell
}

使用此行重复使用单元格时

let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell
屏幕外未使用的单元格将返回给您。此未使用的单元格将根据其旧值设置其属性-交换机状态和公司名称

现在,您正在根据数据更新要设置的companyName,这非常完美:

cell.companyName.text = companies[indexPath.row]
但是,这里您没有设置交换机的状态,它仍然具有旧值。您将需要维护交换机状态的数据,并在CellForRowatineXpath方法中相应地进行设置。类似于此,其中switchStateArray是交换机状态的数据源:

cell.yourSwitch.on = switchStateArray[indexPath.row]

使用此行重复使用单元格时

let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell
屏幕外未使用的单元格将返回给您。此未使用的单元格将根据其旧值设置其属性-交换机状态和公司名称

现在,您正在根据数据更新要设置的companyName,这非常完美:

cell.companyName.text = companies[indexPath.row]
但是,这里您没有设置交换机的状态,它仍然具有旧值。您将需要维护交换机状态的数据,并在CellForRowatineXpath方法中相应地进行设置。类似于此,其中switchStateArray是交换机状态的数据源:

cell.yourSwitch.on = switchStateArray[indexPath.row]

现在,您有了一个模型来表示这个由31个公司名称组成的数组。我个人倾向于一系列自定义公司对象,这些对象不仅包括公司名称,还包括该公司的状态,即其开关是开还是关:

class Company {
    let name: String
    var state = false

    init(name: String) {
        self.name = name
    }
}
并且,我们还假设您已将单元格中的UISwitch连接到CompanyCell类中的IBOutlet:

如果您有一个属性companys,它是这些公司对象的数组,那么您可以实现UITableViewDataSource方法:

您可能还希望将单元格中开关的值更改操作连接到表视图控制器中的方法,如果开关状态更改,该方法将更新模型:

@IBAction func didChangeValueInSwitch(sender: UISwitch) {
    let cell = sender.superview?.superview as! CompanyCell
    let indexPath = tableView.indexPathForCell(cell)
    let company = companies[indexPath!.row]
    company.state = sender.on
}

现在,您有了一个模型来表示这个由31个公司名称组成的数组。我个人倾向于一系列自定义公司对象,这些对象不仅包括公司名称,还包括该公司的状态,即其开关是开还是关:

class Company {
    let name: String
    var state = false

    init(name: String) {
        self.name = name
    }
}
并且,我们还假设您已将单元格中的UISwitch连接到CompanyCell类中的IBOutlet:

如果您有一个属性companys,它是这些公司对象的数组,那么您可以实现UITableViewDataSource方法:

您可能还希望将单元格中开关的值更改操作连接到表视图控制器中的方法,如果开关状态更改,该方法将更新模型:

@IBAction func didChangeValueInSwitch(sender: UISwitch) {
    let cell = sender.superview?.superview as! CompanyCell
    let indexPath = tableView.indexPathForCell(cell)
    let company = companies[indexPath!.row]
    company.state = sender.on
}
在单元格类中编写func prepareforuse

class CompanyCell : UITableViewCell {
@IBOutlet weak var companyName: UILabel!
@IBOutlet weak var companySwitch: UISwitch!

override func awakeFromNib() {
    super.awakeFromNib()
 // Initialization code
}
override func prepareForReuse() {
//set your cell's state to default here
self.companySwitch.isOn = false
}
}
在单元格类中编写func prepareforuse

class CompanyCell : UITableViewCell {
@IBOutlet weak var companyName: UILabel!
@IBOutlet weak var companySwitch: UISwitch!

override func awakeFromNib() {
    super.awakeFromNib()
 // Initialization code
}
override func prepareForReuse() {
//set your cell's state to default here
self.companySwitch.isOn = false
}
}

如果UITableCells imageview重复,请使用函数func prepareForReuse


如果UITableCells imageview重复,请使用函数func prepareForReuse


您需要在cellForRowAtIndexPath方法中设置开关的状态。@rmaddy我建议您添加一个带有此选项的答案,以便它可以被接受。我相信这是正确的解决方案。您需要在cellForRowAtIndexPath方法中设置开关的状态。@rmaddy我建议您添加一个答案,以便接受它。我相信这是正确的解决方案。不要因为有了交换机就停止使用出列。那不是个好主意。正如rmaddy所说,cellForRowAtIndexPath应该设置开关,就像它设置公司名称一样。为什么我会被否决?我只是给出了所有的备选方案。你被否决了,因为按照你最初的答案,关闭出列逻辑是不明智的。正确的答案是保持出列逻辑,但只需设置开关,您现在已经将其合并到了这里。我建议完全放弃“创建新单元”讨论,因为这是个糟糕的主意。此外,仅仅将开关设置为false也是一个坏主意。你真的应该参考
指示该开关的状态。你们能帮我使用cellForRowAtIndexPath函数吗?对不起,我正在学习swift。不要因为有开关就停止使用“出列”。那不是个好主意。正如rmaddy所说,cellForRowAtIndexPath应该设置开关,就像它设置公司名称一样。为什么我会被否决?我只是给出了所有的备选方案。你被否决了,因为按照你最初的答案,关闭出列逻辑是不明智的。正确的答案是保持出列逻辑,但只需设置开关,您现在已经将其合并到了这里。我建议完全放弃“创建新单元”讨论,因为这是个糟糕的主意。此外,仅仅将开关设置为false也是一个坏主意。你真的应该参考指示开关状态的模型。你们能帮我使用cellForRowAtIndexPath函数吗?对不起,我正在学习swift。这会清除第一个和重复单元格的图像,有没有办法避免这会清除第一个和重复单元格的图像,有没有办法避免