可重用的tableview单元在没有交互的情况下相互影响

时间:2017-02-22 14:57:36

标签: ios swift uitableview uiswitch

我一直试图在Swift中完全以编程方式创建一个应用程序,并且使用UITableViews遇到了问题。 我创建了一个自定义可重用的单元格,我称之为“exerciseCell”,其中有一个UILabel,一个UIImageview和一个UISwitch。

我的问题是,当我选择第0行的开关时,它也会打开第3行和第6行的开关。对于每个单元,它们都是相同的,它们每个都会影响大约三个单元。 此表格视图的目的是能够选择您想要一个练习列表的练习,但每个练习都需要能够独立选择。

以下是单元格的代码:

class exerciseCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

var cellSelected:Bool = false

let excersiseLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.textColor = UIColor.red
    label.textAlignment = NSTextAlignment.center
    return label
}()
let excersiseImage: UIImageView = {
    let image = UIImageView()
    image.backgroundColor = UIColor.blue
    image.translatesAutoresizingMaskIntoConstraints = false
    return image
}()

let thisSwitch: UISwitch = {
    let thisSwitch = UISwitch()
    thisSwitch.isOn = false
    thisSwitch.translatesAutoresizingMaskIntoConstraints = false
    return thisSwitch

}()

func setupViews() {
    addSubview(excersiseLabel)
    addSubview(excersiseImage)
    addSubview(thisSwitch)
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["v0": excersiseLabel]))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-101-[v0(100)]-101-|", options: .alignAllCenterX, metrics: nil, views: ["v0": excersiseImage]))
   addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-120-[v0(100)]-120-|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["v0": thisSwitch]))

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-12-[v0(30)]-8-[v1(100)]-12-[v2(30)]-12-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": excersiseLabel, "v1": excersiseImage, "v2": thisSwitch]))

}

}

cellForRow如下:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var thisCell = UITableViewCell()

    if tableView == self.tableView {
        let aCell = tableView.dequeueReusableCell(withIdentifier: "thirdCellID", for: indexPath) as! exerciseCell
        aCell.excersiseLabel.text = "\(mobility[indexPath.row])"
        aCell.thisSwitch.tag = indexPath.row
        thisCell = aCell
    }
    return thisCell

}

如何让单元格独立响应用户?如果需要澄清,我可以提供更多代码。

2 个答案:

答案 0 :(得分:3)

由于表格视图会重复使用单元格,因此它们不会保留其开关设置。您将需要一个外部构造来跟踪选择的单元格。

单元格需要让控制器知道它的开关何时被切换(可能是通过委托),此时你需要更新你的(例如)BOOL数组。

然后,在cellForRowAtIndexPath中,您需要一些代码才能将正确的值应用于单元格。类似的东西:

cell.switch.isOn = cellSwitchStates[indexPath.row]

答案 1 :(得分:0)

这是uitableviewcell中常见的问题。解决此问题的最佳方法是使用Objects配置单元格。

例如,在您的情况下,您需要在Tableview中显示Exercise列表。 因此,使用布尔变量(例如Select * From YourTable Where YourDateField Between Format(DateSerial(Year(Date()), Month(Date()), 1), "yyyymmdd") And Format(DateAdd("d", -1, Date()), "yyyymmdd") )为练习创建一个模态类。

var switchState: Bool

然后使用默认的switchState值false填充一个Exercise对象数组(例如class Exercise: NSObject { var exerciseName : String? var switchState : Bool = false init (exerciseName : String?,switchState : Bool) { super.init() self.exerciseName = exerciseName self.switchState = switchState } } )。

然后TableView numberofrows从exercise数组中获取...返回exercise.count,

var exercises : [Exercise] 从练习数组中取正确的运动对象,例如:cellForRowAt indexPath,现在我们有正确的对象吗?所以在你的自定义单元格中创建一个方法var exercise = exercises[indexpath.row](在你的情况下,单元格将是aCell) 因此,从cellForRowAt indexPath调用此单元格方法,并将我们的运动对象作为参数

传递

例如: fun configureCellWith(exercise:Exercise) 而exerciseCell中的configureCellWith()方法应该是这样的

aCell.configureCellWith(exercise)

然后在exerciseCell

中为您的开关创建一个动作方法
// Write this method within exerciseCell
func configureCellWith(exercise:Exercise) {

privateExercise = exercise // privateExercise is a private Variable for exerciseCell so please create private var privateExercise : Exercise in exerciseCell

thisSwitch.isOn = exercise.switchState 

}

现在一切都很好..请打开/关闭第0行并检查它是否会影响其他行。感谢。