我正在使用标签栏应用程序,其中一个标签有一个连接到UISearchBar的UISearchDisplayController。它全部连接在NIB上并且正在工作。当我点击搜索栏时,“范围”和“取消”按钮会等等,搜索代理会正确更新结果表。
但是,我正在尝试在viewDidLoad
消息而不是NIB中实现相同的代码,但是当我从NIB中删除搜索显示控制器并取消注释我的代码以在函数中创建相同的控制器时,它不起作用。就好像没有进行一些基本连接,所以我的所有搜索代理功能都没有被调用。
这是我的工作 NIB版本的搜索显示控制器。它连接到搜索栏,UINavigationController
子类(MASearchController
),并将其根视图连接为searchContentsController
。
alt text http://img192.imageshack.us/img192/3050/screenshot20100307at304.png
现在这是您希望在代码中创建相同的内容,对吧?我正在做的是将UISearchBar留在NIB中,以便在代码中一次消除一块拼图。
// [MASearchController viewDidLoad]
UISearchDisplayController *searchController = [[[UISearchDisplayController alloc]
initWithSearchBar:searchBar
contentsController:[[self viewControllers] objectAtIndex:0]] autorelease];
[searchController setDelegate:self];
[searchController setSearchResultsDelegate:self];
[searchController setSearchResultsDataSource:self];
我在运行时检查了所有对象,然后全部检查出来。基本上我已经从NIB中删除了搜索显示控制器,然后输入代码在viewDidLoad
消息中创建它。
为什么这不起作用?搜索键盘出现但我的搜索和按钮动画功能都不起作用???
答案 0 :(得分:9)
我想,因为UIViewController的searchDisplayController属性是在initWithSearchBar中设置的:contentsController:message我仍然会自动发布我的指针副本,但当我删除autorelease
时,愚蠢的东西开始工作了。 Gaaaah。为什么它不会保留自己的副本(UIViewController)?
答案 1 :(得分:3)
通常子对象不应保留其父对象。在这种情况下,它的父控制器应该保留子节点(这是搜索显示控制器)。
当您在NIB文件中创建SDC时,这已经自动完成了,因为它已添加到视图控制器的searchDisplayController
属性中,因此保留了视图控制器的生命周期。
但是,由于在视图控制器上设置searchDisplayController
属性为considered usage of private api。您应该添加一个ivar来保留它并在dealloc上手动释放它。
简单地删除autorelease
来电是一个内存泄漏,因为你在init
对象周围留下了一个对象而没有保存对它的引用所以我不认为这是正确答案。
相反,您应该将searchController
正确地保留在ivar中并在dealloc上正确释放它,就像您希望在视图控制器的生命周期内保持活动状态一样。