UİSearchDisplayController kodda oluşturulduğunda çalışmıyor mu?

bir sekme çubuğu uygulaması üzerinde çalışıyorum ve sekmelerden biri bir Uısearchdisplaycontroller bir Uısearchbar'a bağlandı. Bir şey düzgün çalışmıyor ve ne olduğundan emin değiliz. Arama çubuğuna dokunduğumda, Kapsam ve iptal düğmeleri vb. uçar ve arama temsilcisi sonuçlar tablosunu doğru şekilde günceller.

ancak, uç yerine viewDidLoad mesajında aynı kodu uygulamaya çalışıyorum, ancak uçtan arama ekranı denetleyicisini sildiğimde ve işlevdeki aynı denetleyiciyi oluşturmak için kodumu kaldırın, işe yaramıyor. Sanki tüm arama temsilci işlevlerimin çağrılmaması için yapılmayan bazı temel bağlantı var gibi.

İşte çalışma arama ekran denetleyicisinin uç sürümü. Arama çubuğuna, UINavigationController alt sınıfına ( MASearchController ) bağlandı ve bunun kök görünümü searchContentsController olarak bağlandı .

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

şimdi aynı şeyi oluşturmak için kodda yapmayı beklediğiniz şey bu, değil mi? Yaptığım şey, Uısearchbar'ı koddaki bir seferde bulmacanın bir parçasını ortadan kaldırmak için uçta bırakmaktır.

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

tüm nesneleri çalışma zamanında kontrol ettim ve hepsi kontrol etti. Esasen arama ekran denetleyicisini uçtan sildim ve sonra koydum viewDidLoad mesajında oluşturmak için kodda.

neden bu işe yaramadı? Arama klavyesi geliyor ama arama ve düğme animasyon işlevlerimin hiçbiri çalışmıyor mu???

7
tarihinde sordu Nick Bedford 2010-03-07 08:14:52
kaynak

2 ответов

Vay canına, sorunu çözdüm.

düşündüm, çünkü uiviewcontroller için searchdisplaycontroller özelliği initWithSearchBar:contentsController: message içinde ayarlanır hala işaretçinin kopyasını autorelease, ancak autorelease kaldırdığımda aptal şey çalışmaya başladı. Gaaaah. Neden kendi kopyasını (UİViewController) tutmasın?

9
cevap Nick Bedford 2010-03-07 09:14:02
kaynak

genellikle çocuk nesneleri ebeveynini korumak gerekir. Bu durumda, çocuğu (arama ekran denetleyicisi olan) tutması gereken üst denetleyici.

bu görünüm denetleyicisinin searchDisplayController özelliği eklendi ve böylece görünüm denetleyicisinin ömrü için muhafaza edilmiştir çünkü uç dosyasında SDC oluştururken otomatik olarak sizin için yapılmıştır.

ancak searchDisplayController özelliğini bir görünümde ayarladıktan sonra kontrolör özel apı kullanımı olarak kabul edilir. Onu korumak ve dealloc el ile serbest bırakmak için bir ıvar eklemelisiniz.

sadece autorelease çağrısını kaldırmak, init -ed bir nesneyi init - ed bir referans kaydetmeden bıraktığınız için bir bellek sızıntısıdır, bu yüzden doğru cevap olduğunu düşünmüyorum.

yerine searchController i bir ıvar'da düzgün bir şekilde muhafaza etmeli ve serbest bırakmalısınız görünüm denetleyicisinin ömrü boyunca hayatta kalmak istediğiniz herhangi bir nesne gibi dealloc üzerinde düzgün çalışır.

3
cevap chakrit 2017-05-23 15:24:20
kaynak