UISegmented Control无法正常工作

时间:2017-12-26 14:31:34

标签: ios swift uisegmentedcontrol

我有一个分段控件,如下所示:

enter image description here

使用cellForRowAt中的以下代码:

switch cell.methodType.selectedSegmentIndex{
            case 0: expense.cash = true && expense.credit != true
            case 1: expense.credit = true && expense.cash != true
            default:
                break
            }

当我点击其他3列时,我选择了一个选项,然后我被定向回到这个视图控制器,它被填充如下。

enter image description here

然而,在随机时间,分段控制可以从信用转换为现金,我必须重新选择信用。我不知道为什么会这样。它有时会发生,而不会发生在其他地方。无论何时发生这种情况,我的费用类型都会从信用卡转为现金,而不会注册为信用卡。我在另一个视图控制器中的cellForRowAt中有以下代码,其中保存所有费用,如下所示:

 if expense.cash && expense.expense{
        print("cash")
        cell.cashOrCredit.image = #imageLiteral(resourceName: "Cash-Expense Icon")
    }
    else if expense.cash && expense.income{
        print("cash")
        cell.cashOrCredit.image = #imageLiteral(resourceName: "Cash-Income Icon")
    }
    else if expense.credit && expense.income{
        print("credit")
        cell.cashOrCredit.image = #imageLiteral(resourceName: "Credit-Income Icon")
    }
    else if expense.credit && expense.income{
        print("credit")
        cell.cashOrCredit.image = #imageLiteral(resourceName: "Credit-Expense Icon")
    }

如果在我点击其他3行时分段控件没有改变,那么它会注册为“credit”,但如果它随机决定改为现金,那么费用就会记录为“cash”。

以下是我的整个cellForAtIndexPath

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "listCell", for: indexPath) as! ListDataTableViewCell

    if indexPath.row == 0{
        cell.dataTitleLabel.text = "Category"
        cell.methodType.isHidden = true
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = categoryDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true

    } else if indexPath.row == 1{
        cell.dataTitleLabel.text = "Method"
        cell.methodType.isHidden = false
        cell.methodType.tintColor = UIColor(red:0.29, green:0.68, blue:0.71, alpha:1.0)
        cell.optionSelectedLabel.isHidden = true
        cell.accessoryType = .none
        cell.selectionStyle = .none

    } else if indexPath.row == 2{
        cell.dataTitleLabel.text = "Currency"
        cell.methodType.isHidden = true
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = currencyDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true
        cell.optionSelectedLabel.minimumScaleFactor = 0.2

    } else if indexPath.row == 3{
        cell.dataTitleLabel.text = "Collection"
        cell.methodType.isHidden = true
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = collectionsDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true


    }
    return cell
}

我尝试将代码更新为此

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "listCell", for: indexPath) as! ListDataTableViewCell
    let cell2 = tableView.dequeueReusableCell(withIdentifier: "listCell2", for: indexPath) as! ListDataTableViewCell2

    if indexPath.row == 0{
        cell.dataTitleLabel.text = "Category"
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = categoryDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true
        return cell

    } else if indexPath.row == 1{
        cell2.dataLabel.text = "Method"
        cell2.methodType.isHidden = false
        cell2.methodType.tintColor = UIColor(red:0.29, green:0.68, blue:0.71, alpha:1.0)
        cell2.accessoryType = .none
        cell2.selectionStyle = .none
        return cell2

    } else if indexPath.row == 2{
        cell.dataTitleLabel.text = "Currency"
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = currencyDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true
        cell.optionSelectedLabel.minimumScaleFactor = 0.2
        return cell

    } else if indexPath.row == 3{
        cell.dataTitleLabel.text = "Collection"
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        cell.optionSelectedLabel.isHidden = false
        cell.optionSelectedLabel.text! = collectionsDisplayed
        cell.optionSelectedLabel.adjustsFontSizeToFitWidth = true
        return cell
    }
    else {
        return cell
    }
}

但是在声明cell2

的行中遇到了SIGABRT错误

1 个答案:

答案 0 :(得分:2)

分段控件不会随意翻转。我可以告诉你,这种情况发生在滚动单元格后,段控制远远超出视线并再次返回。

当细胞从视线中消失时,它们会被重复用于使用相同细胞标识符的其他细胞。如果你有一个很长的桌子,细胞也可能会被解除分配。

假设您没有很长的表,我的猜测是您没有专门用于具有段控制的单元格的单元标识符。如果是这种情况,请尝试为该分段的单元格提供唯一标识符;问题应该消失。

但这还不够。如果它不在视线范围内(长/远足够),您的分段单元仍然可以被释放。因此,您需要将视图控制器选择存储在视图控制器中的某个位置,并在cellForRowAt中设置所选的段。如果这样做,则不再需要唯一的单元标识符。

在这里查看您添加的代码有以下几点:

  1. 您必须只在cellForRowAt indexPath:中获取两个单元格中的一个,具体取决于indexPath。因此,您可以将dequeueReusableCell放在if块中。
  2. 您仍然没有设置methodType的值(请参阅上面的答案)。
  3. 术语Type令人困惑。根据相当常见的命名方式,我称之为methodSegmentControl(或methodSegment)。
  4. 事实上,正如您所做的那样,通常会创建两个单元格类:ListDataTableViewCellListDataTableViewCell2。您现在可以删除cell.methodType.isHidden = true/false,因为只有单元格2需要段控制。
  5. 我希望这有助于澄清事情。祝你好运!

    您似乎缺乏如何使用iOS中的表格和单元格的基本知识。我建议你阅读一个很好的教程。我会节省你很多时间试图通过反复试验弄明白。