Select 获取 CoreData 以将结果传递给发送方视图控制器后,tableView 中的一行

Select a Row in a tableView after fetching CoreData to pass the result to sender View Controller

作为 Swift iOs 编码的新手,我长期以来一直在努力解决这个问题。希望有人能给我指出正确的方向。

在下面的代码中,我对带有人名的 CoreData 实体执行了 Fetchrequest。一旦我得到结果,我会尝试选择(点击相应的行)一个名称并将其传递回 ViewController 调用此视图并准备继续。

但是每次我点击我想要 select 的名称所在的行时,我都会得到一个:“*** 由于未捕获的异常 'NSInternalInconsistencyException' 而终止应用程序,原因:'Invalid index path for use with UITableView. Index paths passed to table view must contain exactly two indices specifying the section and row. Please use the category on NSIndexPath in UITableView.h if possible.'"

我似乎以错误的方式调用了我的 indexPath。

下面是我的代码:

    .....
    .....

    let fetchedResults =
    managedObjectContext.executeFetchRequest(fetchRequest,
        error: &error) as [NSManagedObject]?

    if let results = fetchedResults {
        names = results
    } else {
        println("Could not fetch \(error), \(error!.userInfo)")
    }
}

// MARK: - UITableViewDataSource

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return names.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("KidCell") as UITableViewCell

    let kidName = names[indexPath.row]
    cell.textLabel!.text = kidName.valueForKey("kidName") as String?
    if kidName != selectedKid {
        cell.accessoryType = .None

    } else {
        cell.accessoryType = .Checkmark
        selectedIndexPath = indexPath
    }

    return cell
}

// MARK: - UITableViewDelegate

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.row != selectedIndexPath.row {
        if let newCell = tableView.cellForRowAtIndexPath(indexPath) {
            newCell.accessoryType = .Checkmark
        }

        if let oldCell = tableView.cellForRowAtIndexPath(selectedIndexPath) {
            oldCell.accessoryType = .None
        }

        selectedIndexPath = indexPath
    }
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SelectedKid" {
        let cell = sender as UITableViewCell
        if let indexPath = tableView.indexPathForCell(cell) {
            let kidName = names[indexPath.row]
            selectedKid = kidName.valueForKey("kid") as String!
        }
    }

} }

我的想法是,当我点击名称时,我会返回到发件人控制器,然后将 selectedName 放在正确的位置。

感谢您的帮助! 克里斯蒂亚诺

您的问题出在以下几行...

let cell = tableView.dequeueReusableCellWithIdentifier("KidCell") as   UITableViewCell

let kidName = names[indexPath.row]
cell.textLabel!.text = kidName.valueForKey("kidName") as String?

您的代码应该类似于...

let cell = tableView.dequeueReusableCellWithIdentifier("KidCell", forIndexPath: indexPath ) as UITableViewCell

let kidName = names[indexPath.row]
cell.textLabel!.text = kidName.valueForKey(kidName)