Swift:分段控件在UITableView Cell中表现得很奇怪

时间:2015-10-27 09:41:26

标签: ios swift uitableview uisegmentedcontrol

任何时候我在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中使用section,它们就是好的。根据我现在发现的情况,在每个部分中,行都从0开始计算。

2 个答案:

答案 0 :(得分:2)

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

例如

在某处定义一个带有可能答案的枚举:

          $("#MultiPayment").click(function () {
                var idsToSend = [];
                var grid = $("#Invoice-grid").data("kendoGrid")
                var ds = grid.dataSource.view();
                for (var i = 0; i < ds.length; i++) {
                    var row = grid.table.find("tr[data-uid='" + ds[i].uid + "']");
                    var checkbox = $(row).find(".checkboxGroups");
                    if (checkbox.is(":checked")) {
                        idsToSend.push(ds[i].Id);
                    }
                }
                alert(idsToSend);
                $.post("/whatever", { ids: idsToSend });
            });

然后定义并初始化你的答案数组:

enum Answer {
    case Yes
    case No
    case None
}

在您的单元格实现中添加一个方法来配置具有Answer

的单元格
var answer = [Answer](count: numberOfQuestions, repeatedValue: .None)

最后,在你的cellForRowAtIndex后出列

func setupWithAnswer(answer: Answer)
{
    var selectedIdex = UISegmentedControlNoSegment
    switch answer {
        case .Yes: selectedIdex = 0
        case .No: selectedIdex = 1
        default: break
    }
    self.segmentedControl.selectedSegmentIndex = selectedIdex
}

答案 1 :(得分:2)

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

要在重复使用单元格时避免这种情况,请确保重置其中的数据

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

如果您需要更多解释,请与我们联系。

以下是您的示例项目sampleTableReuse