代码之家  ›  专栏  ›  技术社区  ›  Nick Bedford

uisearchdisplaycontroller在代码中创建时不工作?

  •  7
  • Nick Bedford  · 技术社区  · 14 年前

    我正在开发一个选项卡栏应用程序,其中一个选项卡有一个连接到uisearchbar的uisearchdisplay控制器。在笔尖上都连接好了,正在工作。当我点击搜索栏时,scope和cancel按钮会弹出,等等,搜索代理会正确地更新结果表。

    但是,我试图在 viewDidLoad 消息而不是nib,但是当我从nib中删除search display控制器并取消对代码的注释以在函数中创建相同的控制器时,它不起作用。好像有一些基本的连接没有建立,所以我所有的搜索委托功能都没有被调用。

    这是我的 工作 搜索显示控制器的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中删除了search display控制器,然后在 可视负载 消息。

    为什么这不起作用?搜索键盘出现了,但我的搜索和按钮动画功能没有工作????

    2 回复  |  直到 12 年前
        1
  •  9
  •   Nick Bedford    14 年前

    哇,我刚发现问题。

    我想,因为uiviewcontroller的searchdisplaycontroller属性是在initwithsearchbar:contentscontroller:message中设置的,所以我仍然会自动释放指针的副本,但是当我删除 autorelease 愚蠢的事情开始起作用了。小精灵。为什么它不保留自己的副本(uiviewcontroller)?

        2
  •  3
  •   Community Egal    7 年前

    通常子对象不应该保留其父对象。在这种情况下,它是应该保留子控制器(即搜索显示控制器)的父控制器。

    当您在nib文件中创建sdc时,这是自动完成的,因为它已经添加到视图控制器的 searchDisplayController 属性,因此在视图控制器的生存期内保留。

    但是自从设置 搜索显示控制器 视图控制器上的属性是 considered usage of private api . 您应该只添加一个ivar来保留它,然后在dealloc上手动释放它。

    只需移除 autorelease 调用是一个内存泄漏,因为您将在对象周围留下 init -艾德没有保存对它的引用,所以我认为这不是正确的答案。

    相反,你应该保留 searchController 在ivar中正确地释放它,并在dealloc上正确地释放它,就像您希望在视图控制器的生命周期中保持活动状态的任何对象一样。

    推荐文章