7

Pracuję nad aplikacją paska kart, a jedna z kart ma narzędzie UISearchDisplayController podłączone do karty UISearchBar. Wszystko jest połączone w NIB i działa. Kiedy pukam w pasek wyszukiwania, przyciski Zakres i Anuluj latają itd., A delegat wyszukiwania prawidłowo aktualizuje tabelę wyników.UISearchDisplayController nie działa po utworzeniu w kodzie?

Jednak próbuję zaimplementować ten sam kod w komunikacie viewDidLoad zamiast NIB, jednak gdy usuwam kontroler wyświetlania wyszukiwania z NIB i odkomentowuje mój kod, aby utworzyć ten sam kontroler w funkcji, robi to nie działa. Wygląda to tak, jakby nie było żadnego podstawowego połączenia, aby cała funkcja delegowania wyszukiwania nie była wywoływana.

Oto moja robocza wersja NIB dla Search Display Controller. Jest podłączony do paska wyszukiwania, podklasa UINavigationController (), a widok główny tego jest podłączony jako searchContentsController.

alt text http://img192.imageshack.us/img192/3050/screenshot20100307at304.png

Teraz to jest to, czego można oczekiwać, aby zrobić w kodzie, aby stworzyć to samo, prawda? To, co robię, to opuszczenie UISearchBar w NIB, aby wyeliminować jeden element układanki naraz w kodzie.

// [MASearchController viewDidLoad] 
UISearchDisplayController *searchController = [[[UISearchDisplayController alloc] 
    initWithSearchBar:searchBar 
    contentsController:[[self viewControllers] objectAtIndex:0]] autorelease]; 
[searchController setDelegate:self]; 
[searchController setSearchResultsDelegate:self]; 
[searchController setSearchResultsDataSource:self]; 

Sprawdziłem wszystkie obiekty w czasie wykonywania i wszystkie zostały sprawdzone. Zasadniczo usunąłem kontroler wyświetlania wyszukiwania z NIB, a następnie wstawiam kod, aby utworzyć go w wiadomości viewDidLoad.

Dlaczego to nie zadziałało? Pojawia się klawiatura wyszukiwania, ale żadna z funkcji wyszukiwania i animacji przycisków nie działa?

Odpowiedz

9

Wow, właśnie odkryłem problem.

Pomyślałem, ponieważ nieruchomość searchDisplayController dla UIViewController jest ustawiony wewnątrz initWithSearchBar: contentsController: Komunikat Chciałbym jeszcze autorelease moją kopię wskaźnika, ale kiedy usunąłem autorelease głupia sprawa rozpoczęła pracę. Gaaaah. Dlaczego nie zachowałaby swojej własnej kopii (UIViewController)?

+0

Wystąpiłam z tym samym problemem. Dzięki za zamieszczenie tego! – DOOManiac

3

Zazwyczaj obiekty podrzędne nie powinny zachowywać rodzica. W tym przypadku jest to kontroler nadrzędny, który powinien zachować element potomny (który jest kontrolerem wyświetlania wyszukiwania).

Dokonano tego automatycznie podczas tworzenia pliku SDC w pliku NIB, ponieważ został on dodany do właściwości kontrolera widoku searchDisplayController i tym samym zachowany dla okresu działania kontrolera widoku.

Jednak ustawienie właściwości searchDisplayController na kontrolerze widoku to considered usage of private api. Powinieneś po prostu dodać ivar, aby go zachować i zwolnić go ręcznie dealloc.

prostu usuwając połączenia autorelease jest przeciek pamięci, jak jesteś pozostawiając wokół obiektu, który init -ED bez zapisywania odniesienie do tego, więc nie sądzę, że jest to prawidłowa odpowiedź.

Zamiast tego należy prawidłowo zachować wartość searchController w ivar i zwolnić ją poprawnie w trybie dealloc, tak jak każdy obiekt, który chce pozostać przy życiu przez cały czas działania kontrolera widoku.