indexPath.row在iPhone 6上计算错误,但在其他任何模拟器上都没有,如下所示。 iOS部署目标设置为8.0。当您从第4个选项卡(并且仅从第4个选项卡)单击分段控件中的第2个选项卡时,会发生此计算。
这是应用程序崩溃的地方:
func createCompletedCell(indexPath: NSIndexPath) -> CompletedCell {
var cell = tableView.dequeueReusableCellWithIdentifier(profileCompletionId) as! CompletedCell
println("indexPath.row: \(indexPath.row)")
println("indexPath.row-2: \(indexPath.row-2)")
var completion = switchState == 1 ? completionArr[indexPath.row-2] : favArr[indexPath.row-2] //crashes on this line
cell.setCompletedCell(completion)
return cell
}
来自:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == 0 {
var cell = tableView.dequeueReusableCellWithIdentifier("ProfileDetails", forIndexPath: indexPath) as! ProfileDetails
cell.selectionStyle = UITableViewCellSelectionStyle.None //No background color if cell is clicked
return cell
}
else if indexPath.row == 1 {
var cell = tableView.dequeueReusableCellWithIdentifier("SegControl", forIndexPath: indexPath) as! ProfileSegControl
cell.segControl.selectedSegmentIndex = switchState
cell.segControl.addTarget(self, action: Selector("changeState:"), forControlEvents: UIControlEvents.ValueChanged)
return cell
}
else {
if(switchState == 0 || switchState == 2){
return createBountyCell(indexPath)
}
else {
return createCompletedCell(indexPath)
}
}
}
当我在iPhone 6模拟器上打印indexPath.row变量时,单击第4个分段控制选项卡然后第2个,我得到输出:
(4th tab calcs)
indexPath.row: 2
indexPath.row-2: 0
indexPath.row: 3
indexPath.row-2: 1
(2nd tab calcs)
indexPath.row: 3
indexPath.row-2: 1
当我使用iPhone 4s / 5 / 5s / 6plus时也这样做
(4th tab calcs)
indexPath.row: 2
indexPath.row-2: 0
indexPath.row: 3
indexPath.row-2: 1
(2nd tab calcs)
indexPath.row: 2
indexPath.row-2: 0
问题是,当我点击第二个标签时,indexPath.row应该设置为2,而是设置为3.
答案 0 :(得分:0)
你的逻辑是错误的。考虑一下代码大纲。首先你这样说:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == 0 { // ...
}
else if indexPath.row == 1 { // ...
}
else {
if(switchState == 0 || switchState == 2){ // ...
}
else {
return createCompletedCell(indexPath)
}
}
}
好。那么当你致电createCompletedCell
时,这是什么索引路径?你不知道!你忘记测试了。相反,你测试一些完全不同的东西 - 关于switchState
的东西,我没有做出任何假设的依据。所以此时indexPath
行可以是除0或1之外的任何数字(因为如果它是其中之一,我们现在就会返回)。
所以如果它是2,你不应该感到惊讶,因为你的逻辑允许这种可能性。你的错误是稍后假设不能为2,因为很明显它可以。