indexPath.row在iPhone 6模拟器上计算错误,但不是4s / 5 / 5s / 6plus

时间:2015-08-19 02:38:39

标签: ios xcode swift nsindexpath

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.

1 个答案:

答案 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,因为很明显它可以。