Ios Swift:分段控件在UITableView单元格中的行为很奇怪

Ios Swift:分段控件在UITableView单元格中的行为很奇怪,ios,swift,uitableview,uisegmentedcontrol,Ios,Swift,Uitableview,Uisegmentedcontrol,每当我点击UICell中的分段控件时,其他单元格会立即在相同位置获得该分段控件。看起来分段控制不仅识别出这个特定的一个被点击,而且还识别出其他单元中的另一个 你曾经遇到过这样的问题吗 这是我的自定义单元格实现: class QuestionYesNoCustomCellTableViewCell: UITableViewCell { @IBOutlet weak var questionLabel: UILabel! @IBOutlet weak var segmentControl: ADV

每当我点击UICell中的分段控件时,其他单元格会立即在相同位置获得该分段控件。看起来分段控制不仅识别出这个特定的一个被点击,而且还识别出其他单元中的另一个

你曾经遇到过这样的问题吗

这是我的自定义单元格实现:

class QuestionYesNoCustomCellTableViewCell: UITableViewCell {

@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var segmentControl: ADVSegmentedControl!
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    segmentControl.items = ["TAK", "NIE"]
    segmentControl.font = UIFont(name: "Avenir-Black", size: 12)
    segmentControl.borderColor = UIColor.grayColor()
    segmentControl.selectedIndex = 1
    segmentControl.selectedLabelColor = UIColor.whiteColor()
    segmentControl.unselectedLabelColor = UIColor.grayColor()
    segmentControl.thumbColor = UIColor(red: 46.0/255.0, green: 204.0/255.0, blue: 113.0/255.0, alpha: 1.0)
    segmentControl.addTarget(self, action: "segmentValueChanged:", forControlEvents: .ValueChanged)
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}



func segmentValueChanged(sender: AnyObject?){


    if segmentControl.selectedIndex == 0 {

        segmentControl.thumbColor = UIColor(red: 231.0/255.0, green: 76.0/255.0, blue: 60.0/255.0, alpha: 1.0)
        segmentControl.selectedLabelColor = UIColor.whiteColor()
        segmentControl.unselectedLabelColor = UIColor.grayColor()

    }else if segmentControl.selectedIndex == 1{

        segmentControl.thumbColor = UIColor(red: 46.0/255.0, green: 204.0/255.0, blue: 113.0/255.0, alpha: 1.0)
        segmentControl.selectedLabelColor = UIColor.grayColor()
        segmentControl.unselectedLabelColor = UIColor.whiteColor()
    }

}
此外,我认为值得提供我的tableView委托方法

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {



    return (dict2 as NSDictionary).objectForKey(dictKeysSorted[section])!.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: QuestionYesNoCustomCellTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! QuestionYesNoCustomCellTableViewCell


    cell.questionLabel.text = (dict2 as NSDictionary).objectForKey(dictKeysSorted[indexPath.section])![indexPath.row] as? String
    if indexPath.row % 2 == 0 {
        cell.backgroundColor = UIColor(red: 245.0/255.0, green: 245.0/255.0, blue: 245.0/255.0, alpha: 1.0)
    }
    else {
        cell.backgroundColor = UIColor(red: 225.0/255.0, green: 225.0/255.0, blue: 225.0/255.0, alpha: 0.7)

    }


    return cell


}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return dictKeysSorted[section]
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerCell = tableView.dequeueReusableCellWithIdentifier("CellHeader") as! CustomHeaderCell

            headerCell.backgroundColor = UIColor(red: 20.0/255.0, green: 159.0/255.0, blue: 198.0/255.0, alpha: 1.0)
    headerCell.headerLabel.text = dictKeysSorted[section]
    return headerCell
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 70.0
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return dictKeysSorted.count
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 110.0
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
重述问题的实质:在每个tableView单元格中都有一个段控件。当我更改位于第一行的那个控件的位置时,我向下滚动,看到第5行中的段控件也被移动了,尽管它应该处于默认位置

提前谢谢

编辑:


我认识到下面的解决方案中最大的问题之一——只要您不使用tableView中的节,它们都是好的。问题是,根据我现在发现的,在每个部分中,行从0开始计数。

这是因为UITableViewCells的可重用性。必须在数据源中跟踪每行的选定段索引。然后在cellForRowAtIndexPath中,必须为每个单元格正确设置它

范例

使用可能的答案定义枚举:

enum Answer {
    case Yes
    case No
    case None
}
然后定义并初始化您的答案数组:

var answer = [Answer](count: numberOfQuestions, repeatedValue: .None)
在计算单元的实现中,添加一个方法来配置带有应答的计算单元

func setupWithAnswer(answer: Answer)
{
    var selectedIdex = UISegmentedControlNoSegment
    switch answer {
        case .Yes: selectedIdex = 0
        case .No: selectedIdex = 1
        default: break
    }
    self.segmentedControl.selectedSegmentIndex = selectedIdex
}
最后,在您的CellForRowatinex中,在退出队列后执行

cell.setupWithAnswer(answer: self.answers[indexPath.row])

这是因为UITableViewCells的可重用性。必须在数据源中跟踪每行的选定段索引。然后在cellForRowAtIndexPath中,必须为每个单元格正确设置它

范例

使用可能的答案定义枚举:

enum Answer {
    case Yes
    case No
    case None
}
然后定义并初始化您的答案数组:

var answer = [Answer](count: numberOfQuestions, repeatedValue: .None)
在计算单元的实现中,添加一个方法来配置带有应答的计算单元

func setupWithAnswer(answer: Answer)
{
    var selectedIdex = UISegmentedControlNoSegment
    switch answer {
        case .Yes: selectedIdex = 0
        case .No: selectedIdex = 1
        default: break
    }
    self.segmentedControl.selectedSegmentIndex = selectedIdex
}
最后,在您的CellForRowatinex中,在退出队列后执行

cell.setupWithAnswer(answer: self.answers[indexPath.row])

这可能是使用重用单元格时的原因,当您滚动时,您更改的单元格将再次显示为另一行

为了避免重复使用单元格时出现这种情况,请确保同时重置单元格中的数据

在您的情况下,您必须检查分段值是否已更改,然后在cellForRowAtIndexPath中也更改分段控制值

如果你需要更多的解释,请告诉我


这是一个供您使用的示例项目

这可能是您使用重复使用单元格时的原因,当您滚动时,您更改的单元格将再次显示在另一行中

为了避免重复使用单元格时出现这种情况,请确保同时重置单元格中的数据

在您的情况下,您必须检查分段值是否已更改,然后在cellForRowAtIndexPath中也更改分段控制值

如果你需要更多的解释,请告诉我



这里有一个示例项目供您参考

您能提供一些如何实现这一点的示例吗?我会检查一下,然后给您回复结果:)还有一件事:确保设置一个从您的单元格到控制器的委托,以正确更新答案数组。请详细说明此委托,我到底应该在哪里设置它?你能提供关于我编辑的其余代码吗?你能提供一些例子如何实现吗?我会检查一下,然后给你结果:)还有一件事:确保设置一个从你的单元格到控制器的委托,以正确更新应答数组。你能详细说明这个委托吗,我应该在哪里设置它?你能提供关于我编辑的其余代码吗?谢谢,如果你不介意的话,我很乐意看到一些代码使它工作。此外,我希望单元格保留分段控件的值,以便用户可以返回到它,这是我害怕在CellForRowatineXpath中设置它的方式。前面提到的方法cell.segmentControl.selectedIndex=1中的这一行也不起作用。此外,每当单元格超出屏幕时,值为lostI时,它将为您提供一个示例项目,只需等待minalright I;我要跳进去:)我会回来找你的!为什么用_name而不是name等?我删除了下划线进行测试,它不再工作了,所以我想这很重要:)谢谢,如果你不介意的话,我很乐意看到一些代码使它工作。此外,我希望单元格保留分段控件的值,以便用户可以返回到它,这是我害怕在CellForRowatineXpath中设置它的方式。前面提到的方法cell.segmentControl.selectedIndex=1中的这一行也不起作用。此外,每当单元格超出屏幕时,值为lostI时,它将为您提供一个示例项目,只需等待minalright I;我要跳进去:)我会回来找你的!为什么用_name而不是name等?我删除了下划线以进行测试,但它不再工作,所以我想这很重要:)