当选择单元格时UITableViewCell中的UISwitch冻结app,在UISwitch切换时不会冻结

时间:2016-01-26 23:47:45

标签: ios swift uitableview uiswitch

我有一个UITableView,其中对于某些单元格,我以编程方式将UISwitch添加为accessoryView。对于委托方法didSelectRowAtIndexPath,我立即使用以下内容:tableView.deselectRowAtIndexPath(indexPath, animated: true),如果单元格是自定义类,我会执行一些其他操作(展开/折叠) - UISwitch不是自定义类,它是常规单元格的附件视图,因此在单击单元格时执行tableView.deselectRowAtIndexPath(indexPath, animated: true),这就是全部。问题是,对于具有UISwitch作为附件视图的单元格,如果您打开/关闭开关它可以正常工作 - 但是第二次按下同一单元格上的任何其他位置,它会保持突出显示并且应用程序会冻结。为什么会发生这种情况?如何防止它?

didSelectRowAtIndexPath功能:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        // Deselect automatically if the cell is a DatePickerCell/PickerCell.
        let cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)

        if (cell.isKindOfClass(DatePickerCell)) {

            let datePickerTableViewCell = cell as! DatePickerCell
            datePickerTableViewCell.selectedInTableView(tableView)
            tableView.deselectRowAtIndexPath(indexPath, animated: true)

        } else if(cell.isKindOfClass(PickerCell)) {

            let pickerTableViewCell = cell as! PickerCell
            pickerTableViewCell.selectedInTableView(tableView)
            tableView.deselectRowAtIndexPath(indexPath, animated: true)

        }
}

我按如下方式设置开关:

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

            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell
            let row = indexPath.row

            allDaySwitch.on = false
            gstSwitch.on = false

            //Assigns UISwitch cells and UITextField cells
            if(indexPath.section == 0) {

                let rowTitle = mainOptions[row]
                cell.textLabel?.text = rowTitle
                cell.accessoryView = nil

            } else if(indexPath.section == 1) {

                let rowTitle = dateOptions[row]

                if(rowTitle == "All Day") {
                    cell.accessoryView = allDaySwitch
                } else {
                    cell.accessoryView = nil
                }

                cell.textLabel?.text = rowTitle

            } else if(indexPath.section == 2) {

                let rowTitle = alertOptions[row]
                cell.accessoryView = nil
                cell.textLabel?.text = rowTitle

            } else {

                let rowTitle = billingOptions[row]

                if(rowTitle == "Tax Included") {
                    cell.accessoryView = gstSwitch
                } else {
                    cell.accessoryView = nil
                }

                cell.textLabel?.text = rowTitle
            }

            return cell
    }

selectedInTableView函数:

public func selectedInTableView(tableView: UITableView) {
        expanded = !expanded

        UIView.transitionWithView(rightLabel, duration: 0.25, options:UIViewAnimationOptions.TransitionCrossDissolve, animations: { () -> Void in
            self.rightLabel.textColor = self.expanded ? self.tintColor : self.rightLabelTextColor
            }, completion: nil)

        tableView.beginUpdates()
        tableView.endUpdates()
}

1 个答案:

答案 0 :(得分:1)

您不应该在allowed_status_types中调用cellForRowAtIndexPath,而didSelectRowAtIndexPath已经在dataSource方法中设置了cellForRowAtIndexPath。看起来您在didSelectRowAtIndexPath中使用了静态单元格,您可以轻松地对switch indexPath.row { case 0: // do Something case 1: // do Something default: break } 执行相同操作。

tableView

此外,问题是您传递的UITableViewCell beginUpdates实际上无法正确访问endUpdates。应该在您的视图控制器上调用{{1}}和{{1}},因为您的UITableViewCell不知道(也不关心)tableView本身发生了什么。