代码创建的UISearchDisplayController无法工作?

7
我正在开发一个选项卡应用程序,其中一个选项卡连接了一个UISearchBar和一个UISearchDisplayController。它们在NIB中都已经连接好并且正常工作。当我点击搜索栏时,Scope和Cancel按钮会飞入等等,搜索代理会正确更新结果表。
但是,我尝试在viewDidLoad消息中实现相同的代码,而不是使用NIB。然而,当我从NIB中删除搜索显示控制器并取消注释函数中创建相同控制器的代码时,它就无法工作了。似乎存在某种基本连接未建立,导致所有搜索代理功能都没有被调用。
这是我的工作NIB版本的Search Display Controller。它已连接到搜索栏、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消息中。
为什么这不起作用?搜索键盘出现了,但我的搜索和按钮动画功能都不起作用???
2个回答

9

哇,我刚刚解决了这个问题。

我发现,因为UIViewController的searchDisplayController属性是在initWithSearchBar:contentsController:方法中设置的,所以我仍然会将指针的副本释放,但是当我删除autorelease时,这个愚蠢的东西开始工作了。该怎么办?为什么它不保留自己的副本(即UIViewController)?


我也遇到了同样的问题。感谢您发布这个! - DOOManiac

4
通常情况下,子对象不应该保留其父对象。在这种情况下,应该由父控制器保留子对象(即搜索显示控制器)。
当您在NIB文件中创建SDC时,这已经自动完成了,因为它已添加到视图控制器的searchDisplayController属性中,因此在视图控制器的生命周期内被保留。
然而,由于在视图控制器上设置searchDisplayController属性被认为是使用私有API,因此您应该只添加一个ivar来保留它,并在dealloc时手动释放它。
仅仅删除autorelease调用是一种内存泄漏,因为您留下了一个init但未保存引用的对象,所以我认为这不是正确的答案。
相反,您应该正确地在ivar中保留searchController,并在dealloc时适当地释放它,就像您希望任何要保持视图控制器生命周期内的对象一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接