在UISearchController和FetchRequest之间同步检查标记

时间:2015-10-15 04:56:29

标签: ios swift uitableview core-data uisearchcontroller

我正在尝试在搜索视图和非搜索视图之间同步accessoryType.Checkmark。我已尝试在cell.accessoryType = .None的几个不同位置设置cellForRowAtIndexPath,但在fetchedResults和搜索结果之间切换时,我会不断收到随机复选标记。我不知道我搞砸了什么,但我放心,这将是令人吃惊的蠢事。

我设置了UITableViewController。加载时,我将其配置为显示NSFetchRequest中的项目。它运作得很好。

我还设置了UISearchController。它完美运行并显示我想要的结果。

当我在搜索和fetchRequest之间切换时,我遇到了出现随机复选标记的问题。我保存的一系列东西工作得很完美,正确的项目就在那里 - 这是正在进行检查的复选标记。任何反馈将不胜感激。我没有想法。

以下是我在viewDidLoad课程UITableViewController之前宣布的相关属性:

// Create array to dump fetchResults
var unfilteredJingles = [Jingle]()

// Create array to store filtered search results
var filteredJingles = [Jingle]()

// Array where ones I want to save get added/removed
var jinglesToSave = [Jingle]()

// resultsSearchController
var resultsSearchController = UISearchController()

选择单元格后,我将didSelectRowAtIndexPath配置为执行以下两项操作:

1)将该单元格的jinglesToSave附加到数组,并在单元格旁边放置一个复选标记。这很有效。

2)从jinglesToSave数组中删除该单元格的jinglesToSave。这也有效。

我遇到的问题是,当我在searchResultsController.activesearchResultsController处于非活动状态时切换时,会检查随机单元格。正确的细胞保持检查,但有时会检查随机细胞。

这是我的cellForRowAtIndexPath

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

    // instantiate a local array and assign it to filtered/unfiltered results based on whether
    // the resultsSearchController is active
    var jingleArray = [Jingle]()

    if resultsSearchController.active {
        // set local array to the filtered array
        jingleArray = filteredJingles
        let jingle = jingleArray[indexPath.row]
        // Set labels for cell
        cell.textLabel?.text = jingle.jingleDescription
        cell.detailTextLabel?.text = jingle.jingleStar

    } else {
        // set the local array to the UN-filtered array
        jingleArray = unfilteredJingles
        // Get the jingle for the index
        let jingle = jingleArray[indexPath.row]
        // Set labels for cell
        cell.textLabel?.text = jingle.jingleDescription
        cell.detailTextLabel?.text = jingle.jingleStar
    }

    // Set checkmarks
    if self.jinglesToSave.count > 0 {
        // enumerate jinglesToSave...
        for (indexOfJinglesToSave, jingleToSave) in jinglesToSave.enumerate() {
            // if the object in the array of stuff to save matches the object in the index of the tableview
            if jingleArray[indexPath.row].hashValue == jinglesToSave[indexOfJinglesToSave].hashValue {
                // then set its accessoryView to checkmark
                cell.accessoryType = .Checkmark
            }
        }
    }

    return cell
}

1 个答案:

答案 0 :(得分:1)

在单元格出列后,将单元格复选标记状态重置为默认状态(我猜不会选中复选标记)。它可能是一个细胞回收问题,检查标记出现在不应该出现的细胞上。