gpt4 book ai didi

ios - UITableViewController 不会用 NSFetchedResultsControllerDelegate + UISearchBarDelegate 更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:47 30 4
gpt4 key购买 nike

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

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

和 .m 是这样的:

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

当项目被选中时,它会使用标准 segue 推送到详细 View :

@interface PartSearchDetailViewController : UIViewController

我希望应用程序执行的大部分操作似乎都有效。详细 View 中有几个开关 + 字段,更改后会写入核心数据。如果用户在详细 View 中进行了更改,然后返回到 TableView (通过点击 <搜索),则相应单元格中对象的更改将按预期呈现,但前提是没有实现搜索。但是,如果在表中实现了搜索,则在用户“滚动”并强制受影响的单元格在过滤组内重新绘制之后,表中过滤对象集的更改才会显示。

我已验证对象数据的更改肯定是在 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 在对 TableView 应用搜索时调用的内容:

- (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, TableView 通常会去往 self.fetchedResultsController 的任何地方,它会去往 self.filteredList 代替。

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

最佳答案

根据我的经验,最好有两个获取结果 Controller ,一个用于您的主要数据,一个用于您的过滤。然后,您可以检查表数据源方法内部是否处于搜索模式,并从适当的获取结果 Controller 返回值。当搜索显示 Controller 委托(delegate)方法调用开始搜索时,更改搜索获取结果 Controller 的谓词,执行获取并重新加载搜索 TableView 。您应该会看到正确的结果。

关于ios - UITableViewController 不会用 NSFetchedResultsControllerDelegate + UISearchBarDelegate 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713599/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com