0

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ブロックで上記のように正しいアプローチであるかどうか、または内で同じことを行う必要があるかどうかを理解したい:-

  1. viewWillDisappear/viewDidDisappear
  2. deinit{ if let superView = searchController.view.superview { superView.removeFromSuperview() } }

どれが正しいことですか?

4

1 に答える 1