首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UITableViewController不会用NSFetchedResultsControllerDelegate + UISearchBarDelegate更新

UITableViewController不会用NSFetchedResultsControllerDelegate + UISearchBarDelegate更新
EN

Stack Overflow用户
提问于 2013-12-20 23:34:01
回答 1查看 63关注 0票数 2

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

代码语言:javascript
复制
@interface PartsSearchViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> {
    NSMutableArray *parts;
    NSManagedObjectContext *managedObjectContext;
    Metadata *metadata;
}

.m是这样的:

代码语言:javascript
复制
@interface PartsSearchViewController () <NSFetchedResultsControllerDelegate, UISearchDisplayDelegate, UISearchBarDelegate>

当项被选中时,它将w/standard推入一个详细视图:

代码语言:javascript
复制
@interface PartSearchDetailViewController : UIViewController

我想让这个应用程序做的大部分工作看起来都很有效。在详细视图中有几个开关+字段,当更改时,这些字段会写入核心数据。如果用户在detail视图中进行更改,则返回到表视图(通过按< Search),相应单元格中对象的更改将按照预期的呈现,但只有在没有实现搜索的情况下才能这样做。但是,如果在表中实现了搜索,则在用户“滚动”并迫使受影响的单元格在筛选的集合中重新绘制之后,才会显示表中已过滤的对象集上的更改。

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

我还证实,在任何情况下(搜索或不执行搜索),都调用了我的viewWillAppear

代码语言:javascript
复制
- (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在对表视图应用搜索时调用的内容:

代码语言:javascript
复制
- (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新手。任何帮助都是值得感激的。我可以提供更多的代码-只是不确定什么是相关的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-20 23:43:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20713599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档