searchController は viewDidLoad()
、TableViewController で として宣言されていsearchController = UISearchController(searchResultsController: nil)
ます。ユーザーが現在のテーブル ビューで行を選択すると、 を使用して前のビュー コントローラーに移動しself.navigationController?.popViewControllerAnimated(true)
ます。これが発生するたびに、警告が表示されます-
「割り当て解除中にView Controllerのビューを読み込もうとすることは許可されておらず、未定義の動作が発生する可能性があります」
これを避けるために、popViewControllerAnimated(true)
ナビゲーションコントローラーを呼び出す前に、検索コントローラーをスーパービューから削除しています。
検索がアクティブで行が選択されている場合、同じ警告は表示されません。最初に検索コントローラーを閉じてから前のコントローラーに飛び出すため、この場合は正常に機能する可能性があります。しかし、検索がアクティブかどうかに関係なく、すべての場合に検索コントローラーを閉じると、役に立ちません。
これがコードです。
//Dismiss searchController if active & Navigate to previous view controller on row selection
if self.searchController.active {
self.searchController.dismissViewControllerAnimated(true, completion: {
self.navigationController?.popViewControllerAnimated(true)
})
}
else {
//remove UISearchController from superView
self.searchController.view.superview?.removeFromSuperview()
self.navigationController?.popViewControllerAnimated(true)
}
これがelseブロックで上記のように正しいアプローチであるかどうか、または内で同じことを行う必要があるかどうかを理解したい:-
viewWillDisappear/viewDidDisappear
deinit{ if let superView = searchController.view.superview { superView.removeFromSuperview() } }
どれが正しいことですか?