UITableViewController不会使用NSFetchedResultsControllerDelegate + UISearchBarDelegate进行更新

时间:2013-12-20 23:34:01

标签: ios objective-c

我在.h中定义了一个UITableViewController,如下所示:

@interface PartsSearchViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> {
    NSMutableArray *parts;
    NSManagedObjectContext *managedObjectContext;
    Metadata *metadata;
}

和.m这样:

@interface PartsSearchViewController () <NSFetchedResultsControllerDelegate, UISearchDisplayDelegate, UISearchBarDelegate>

当选择项目时,它会将标准segue推送到详细视图:

@interface PartSearchDetailViewController : UIViewController

我希望应用程序执行的大多数工作似乎都在起作用。详细视图中有多个开关+字段,当更改时,写入核心数据。如果用户在详细视图中进行了更改,则返回到表视图(通过按&lt; Search ),对相应单元格中对象的更改将呈现为按预期进行的更改,< strong>但仅在没有实施搜索的情况下。但是,如果已在表中实现了搜索,则在用户“滚动”并强制受影响的单元格在已过滤的集合中重绘之前,表格中已过滤对象集的更改不会显示。

我已经验证了对象数据的更改肯定是在Core Data中进行的。 (否则,“滚动”位也不会纠正单元格内容。)

我还验证了在任何一种情况下(搜索或未执行搜索),我的viewWillAppear被调用:

- (void)viewWillAppear:(BOOL)animated
{
    CoreDataController *cdc = [[CoreDataController alloc] init];

    PartsPlant *thisPartsPlant = [cdc getLoadedPartsPlant];
    // A "part" is the object that's displayed in each cell.
    // "parts" is NSMutableArray of "part" objects.
    self.parts = thisPartsPlant.parts;

    UITableView *tv = (UITableView *)self.view;
    [tv reloadData];
}

当我逐步更新单元格时,我可以看到正在传递正确的数据来渲染单元格,但单元格从不渲染。

我怀疑我看不出这个问题,因为我不完全了解UISearchDisplayController内容的变化。我在UseYourLoaf中修改了一个示例,该示例在实现搜索时使用过滤结果填充NSArray。我的猜测是以某种方式重新加载,我需要强制重新渲染此集而不是fetchedResultsController的内容?

以下是将搜索应用于表视图时UISearchDisplayController调用的内容:

- (void)searchForText:(NSString *)searchText scope:(PartsSearchScope)scopeOption
{
    if (self.managedObjectContext)
    {
        NSString *predicateFormat = @"%K CONTAINS[cd] %@";
        NSString *searchAttribute = @"partName";

        if (scopeOption == searchScopePartNumber)
        {
            searchAttribute = @"partNumber";
        }

        NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchAttribute, searchText];
        [self.searchFetchRequest setPredicate:predicate];

        NSError *error = nil;
        self.filteredList = [self.managedObjectContext executeFetchRequest:self.searchFetchRequest error:&error];
        isFilterApplied = YES;
    }
}

然后,如果self.SearchDisplayController.isActive,表格视图通常用于self.fetchedResultsController的任何地方,则会转到self.filteredList

抱歉漫无边际 - 我是一个C / iOS新手。任何形式的帮助表示赞赏。我可以提供更多代码 - 只是不确定是什么相关的。

1 个答案:

答案 0 :(得分:1)

根据我的经验,最好有两个获取的结果控制器,一个用于主数据,一个用于过滤。如果您处于搜索模式,则可以检查表数据源方法,并从相应的提取结果控制器返回值。当搜索显示控制器委托方法调用以启动搜索时,更改搜索获取结果控制器的谓词,执行获取并重新加载搜索表视图。你应该看到正确的结果。