我有一个分段控件,如下所示:
使用cellForRowAt中的以下代码:
switch cell.methodType.selectedSegmentIndex{
case 0: expense.cash = true && expense.credit != true
case 1: expense.credit = true && expense.cash != true
default:
break
}
当我点击其他3列时,我选择了一个选项,然后我被定向回到这个视图控制器,它被填充如下。
然而,在随机时间,分段控制可以从信用转换为现金,我必须重新选择信用。我不知道为什么会这样。它有时会发生,而不会发生在其他地方。无论何时发生这种情况,我的费用类型都会从信用卡转为现金,而不会注册为信用卡。我在另一个视图控制器中的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错误答案 0 :(得分:2)
分段控件不会随意翻转。我可以告诉你,这种情况发生在滚动单元格后,段控制远远超出视线并再次返回。
当细胞从视线中消失时,它们会被重复用于使用相同细胞标识符的其他细胞。如果你有一个很长的桌子,细胞也可能会被解除分配。
假设您没有很长的表,我的猜测是您没有专门用于具有段控制的单元格的单元标识符。如果是这种情况,请尝试为该分段的单元格提供唯一标识符;问题应该消失。
但这还不够。如果它不在视线范围内(长/远足够),您的分段单元仍然可以被释放。因此,您需要将视图控制器选择存储在视图控制器中的某个位置,并在cellForRowAt
中设置所选的段。如果这样做,则不再需要唯一的单元标识符。
在这里查看您添加的代码有以下几点:
cellForRowAt indexPath:
中获取两个单元格中的一个,具体取决于indexPath
。因此,您可以将dequeueReusableCell
放在if
块中。methodType
的值(请参阅上面的答案)。Type
令人困惑。根据相当常见的命名方式,我称之为methodSegmentControl
(或methodSegment
)。ListDataTableViewCell
和ListDataTableViewCell2
。您现在可以删除cell.methodType.isHidden = true/false
,因为只有单元格2需要段控制。我希望这有助于澄清事情。祝你好运!
您似乎缺乏如何使用iOS中的表格和单元格的基本知识。我建议你阅读一个很好的教程。我会节省你很多时间试图通过反复试验弄明白。