2016-04-15 18 views
2

この質問はこれまでに質問されていますが、この問題について明確な説明ができません。私は、テーブルビューと検索機能を持つ単純なアプリケーションを持っています。 viewDidLoad()では、私は、このコードは正しく動作しないしないこのUISearchViewControllerに対してビューコントローラの表示を解除しようとしているときに、ビューコントローラを表示しようとしていません

let searchController = UISearchController(searchResultsController: nil) 
    searchController.searchResultsUpdater = self 
    searchController.hidesNavigationBarDuringPresentation = true 
    searchController.dimsBackgroundDuringPresentation = false 
    self.tableView.tableHeaderView = searchController.searchBar 

のように定義されているsetUpSearchView()を呼び出します。コンソールで、私はこのエラー

Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior 

を見ることができます。また、searchcontrollerは適切にアニメーション化しないと、私は検索バーに入力したときにupdateSearchResultsForSearchControllerデリゲートを呼び出すことはありません。

しかし、これらの問題はすべて、searchController初期化関数を少し変更するだけで簡単に修正できます。関数内のローカル変数としてsearchControllerを宣言するのではなく、var searchController:UISearchController!のようなメソッドの外にインスタンス変数を宣言すると、すべての理由がわかりませんが、すべてが機能します。

今のコードは(setUpSearchViewでこの

var searchController:UISearchController! 

のようになります。)ここで

searchController = UISearchController(searchResultsController: nil) 
searchController.searchResultsUpdater = self 
searchController.hidesNavigationBarDuringPresentation = true 
searchController.dimsBackgroundDuringPresentation = false 
self.tableView.tableHeaderView = searchController.searchBar 

はgithubの上のViewControllerへのリンクがある:これはなぜ起こるかhttps://github.com/tmsbn/marvel_heroes/blob/master/avengers/HeroesListController.swift

誰かが説明することができます?これは迅速なバグですか?それとも、私が知らないiOSの何かです。

+0

これを参照すると、これが役立ちます。http://stackoverflow.com/questions/32282401/attempting-to-load-the-view-of-a-view-controller-while-it-is -deallocating-uis –

答えて

1

関数(viewDidLoad)に変数を作成する場合、その関数の有効期間は関数の有効期間と同じです。この場合、テーブルヘッダービューを割り当て解除されているsearchControllerとして設定しようとしています(生存時間はviewDidLoadsと同じです)

変数をviewDidLoadの外に作成して後でインスタンス化すると、 viewController /クラスとしての寿命

+0

申し訳ありませんが、私はかなり理解していません。 searchControllerがテーブルヘッダービューとして設定される前に割り当て解除されるのはなぜですか?設定テーブルヘッダービューは非同期関数です。 – TMS

+0

私は、コードを実行すると、コンパイラはviewDidLoadの終わりに変数が割り当て解除されるので、テーブルヘッダとして設定するとエラーが発生すると考えています。これは、テーブルヘッダーが設定されている間に、そのオブジェクトへのポインタがすべてなくなったためです。そのため、デリゲートメソッドが機能しないなどの理由があります。 –

+0

わかりました。ご説明ありがとうございます! – TMS

関連する問題