如何修复在swift中重复的UITableCells

时间:2015-07-01 04:43:11

标签: ios swift uitableview user-interface tableview

我知道这里已经有这样的问题,但是我无法让它们中的任何一个起作用。基本上,我有一个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]

标签(公司名称)位于单元格的左侧,开关位于单元格的右侧。

那么如何让细胞停止相互重复使用?

5 个答案:

答案 0 :(得分:2)

使用此行重用单元格时

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

屏幕外的未使用的单元格将返回给您。这个未使用的单元格将具有其属性 - 交换机的状态和根据其旧值设置的公司标题。

此后,您正在根据您的数据更新要设置的companyName,这是完美的:

cell.companyName.text = companies[indexPath.row]

但是,这里您没有设置开关的状态,它仍然具有旧值。您需要维护交换机状态的数据,并在cellForRowAtIndexPath方法中进行相应设置。像这样,switchStateArray是交换机状态的数据源:

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

答案 1 :(得分:1)

现在你有一个代表31个公司名称的数组的模型。我个人倾向于使用一系列自定义Company对象,这些对象不仅包括名称,还包括该公司的状态(即打开或关闭):

class Company {
    let name: String
    var state = false

    init(name: String) {
        self.name = name
    }
}

而且,我们还假设您已将单元格中的UISwitchIBOutlet类中的CompanyCell联系起来:

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

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

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell

    let company = companies[indexPath.row]
    cell.companyName.text = company.name
    cell.companySwitch.on = company.state

    return cell
}

你可能想要把价值改变了#34;单元格中切换到表视图控制器中的方法的操作,如果切换状态发生更改,则会更新模型:

@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
}

答案 2 :(得分:1)

如果重复UITableCells imageview,请使用功能func prepareForReuse()

 class HomeFavoriteCell: UITableViewCell {

        @IBOutlet weak var imglLocation: UIImageView!

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

            self.imglLocation.image = nil
        }

答案 3 :(得分:0)

在您的单元格类中编写func prepareForReuse()

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
}
}

答案 4 :(得分:-1)

这是因为您正在重复使用

单元格
tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell 

要避免这种情况,请重置cellForRowAtIndexPath中的切换

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

  let cell = tableView.dequeueReusableCellWithIdentifier("CompanyCell", forIndexPath: indexPath) as! CompanyCell
  cell.mySwitch.on = false // or Whatever your switch name is (from CompanyCell class)
  cell.companyName.text = companies[indexPath.row]

return cell
}

或创建新单元格

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

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

return cell
}