3

iOS 7 の新しい uisearchbar に問題があります。

私のアプリでは、tableHeaderView に検索バーがある tableview があります。

手作り (プログラムで追加) - ストーリーボードの tableviewcontroller、メソッド viewDidLoad で、UISearchBar から継承したカスタム検索バーで searchDisplayController を追加します。

すべてがナビゲーションコントローラーで行われます。

私のアプリのロジックでは、ある時点で、dismissViewController を送信するこのナビゲーション コントローラーを解放します。

iOS 6では完璧に動作します。

しかし、ios 7 では、ナビゲーション コントローラーを解放しようとするとクラッシュします。

ログには、次の興味深い行があります。

viewDidLoad の最後にこれを追加します:

for (UIView *view in self.view.subviews) {
    NSLog(@"%@ %p", [view.class description], view);
}

iOS 6では、これしかありません:

2013-09-19 12:40:40.553 myApp[4182:c07] KRSearchBar 0x988bdd0

iOS 7 の場合:

2013-09-19 13:08:47.808 myApp[4690:a0b] UIView 0xa265310
2013-09-19 13:08:47.809 myApp[4690:a0b] UITableViewWrapperView 0xa25b4d0
2013-09-19 13:08:47.810 myApp[4690:a0b] KRSearchBar 0xa2591b0

そして、ナビコントローラーを離した後、私は持っています

2013-09-19 13:09:32.419 myApp[4690:a0b] *** -[UIView release]: message sent to     deallocated instance 0xa265310

UIView とは何ですか? それはどこから来て、どのように対処するのですか?

4

1 に答える 1

17

iOS 7 では、テーブルビューとそのデリゲートに関するいくつかのルールが変更されました。もちろん、これは見つけやすい場所で強調表示されていません。

しかし、基本的に、以前のバージョンの iOS では、オプションで tableView デリゲートとデータソースを nil にすることができました。そうしないと、エラーメッセージが送信されませんでした。

iOS 7 以降では、dealloc でそれらを nil にする必要があります。そうしないと、このクラッシュが発生する可能性があります。

- (void)dealloc
{
fetchedResultsController.delegate = nil;
self.searchDisplayController.delegate = nil;
self.searchDisplayController.searchResultsDelegate = nil;
self.searchDisplayController.searchResultsDataSource = nil;
self.tableView.delegate = nil;
self.tableView.dataSource = nil;    
}

これで問題が解決したかどうかお知らせください。

于 2013-09-19T12:19:15.670 に答える