我有 UITableViewController一个UISearchBar作为tableHeaderView它的tableView.我也UISearchDisplayController初始化了它UISearchBar作为它searchBar和UITableViewController它的contentsController.到目前为止一切都很好,一切都近乎有效
问题是UITableView具有accessoryType设置的单元格UITableViewCellAccessoryDetailDisclosureButton.这是发生的事情:

UISearchBar.UISearchDisplayController创建主表顶部的黑色覆盖,并使得指数(如,sectionIndexTitlesForTableView)主表中消失的.UISearchBar,我们仍然可以看到主表,尽管在黑暗叠加层下面添加了UISearchDisplayController.

我对如何解决这个问题感到茫然; 我能想到的唯一选择是找到与披露按钮相对应的UIView并手动移动它,但这看起来非常难看,只是因为即使发现UIView 需要一个讨厌的黑客.如何以更好的方式解决这个问题的任何建议将不胜感激!
最小的可运行示例
以下是一个最小的例子.只需启动一个新的XCode项目,仅启用ARC,iPad,并使用以下内容替换AppDelegate的内容.请注意,为了最小的例子,我强制主表重新加载其单元格searchDisplayController:willShowSearchResultsTableView,否则主表将缓存其单元格并且问题将不会显示(在我的实际应用程序中,主表格因其他原因重新加载其单元格,我不完全确定为什么 - 但当然主表可以随时重新加载单元格.)
要查看发生的问题,请运行代码,在搜索框中键入内容(您将看到"搜索结果0 .. 5"),然后取消搜索.现在,主表的公开按钮显示在索引的下方,而不是旁边.
以下是代码:
@interface AppDelegate ()
@property (nonatomic, strong) UITableViewController* mainTableController;
@property (nonatomic, strong) UISearchDisplayController* searchDisplay;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application …Run Code Online (Sandbox Code Playgroud) 我在Core Data中有一个非常奇怪的反向关系问题,我已经设法将我的问题简化为一个最小的例子,从基于支持Core Data的窗口模板的xcode中的新项目开始(即,那里很少).
假设我们有一个包含三个实体的核心数据模型:Department,Employee和DepartmentSummary(某种实体代表部门的一些统计信息).为简单起见,我们只有一对一的关系:
DepartmentSummary Department Employee
---------------------------------------------------------
employee <----> department
department <----> summary
Run Code Online (Sandbox Code Playgroud)
这就是模型中的全部内容.在application:didFinishLaunchingWithOptions:我们创建一个员工和一个部门并设置KVO:
NSManagedObject* employee =
[NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:[self managedObjectContext]];
[employee addObserver:self forKeyPath:@"department" options:0 context:nil];
NSManagedObject* department =
[NSEntityDescription
insertNewObjectForEntityForName:@"Department"
inManagedObjectContext:[self managedObjectContext]];
[department setValue:employee forKey:@"employee"];
Run Code Online (Sandbox Code Playgroud)
KVO处理程序的目的是在设置员工部门后立即为部门创建摘要:
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
[self createSummary:object];
}
Run Code Online (Sandbox Code Playgroud)
createSummary很简单:它创建一个新的摘要对象并将其与部门关联,然后检查是否还设置了从部门到摘要对象的反向关系:
- (void) createSummary:(NSManagedObject*)employee
{
NSManagedObject* department = [employee valueForKey:@"department"];
NSManagedObject* summary =
[NSEntityDescription
insertNewObjectForEntityForName:@"DepartmentSummary"
inManagedObjectContext:[self managedObjectContext]];
[summary setValue:department forKey:@"department"];
NSAssert([department valueForKey:@"summary"] == summary, …Run Code Online (Sandbox Code Playgroud) 这是一个问题,因为它是一个警告; 我的应用程序中有一个错误,我最终跟踪到以下内容:在prepareForDeletion某个NSManagedObject子类中,我正在访问一个通过执行获取请求按需创建的数组.如果该数组在prepareForDeletion调用时已经存在(因此当不需要获取请求时)一切正常,但是如果数组尚未加载并且执行了获取请求,则似乎删除了对象 - 关于 -当执行fetch时,实际上已完成了要删除的操作,因此无法prepareForDeletion完成其任务.我找不到其他任何人抱怨这个,但是,在文档中也没有提到它,所以也许是其他的东西.我很好奇其他人是否看到过这种行为.