2016-12-22 19 views
-1

他のView Controllerからビューが提供されている検索コントローラがあります。基本的に私は別のビューの中にNavBarButtonを持っており、それを押すとsearchcontollerが表示されます。Swift iOS SearchControllerがViewDidLoadで呼び出されていない

何らかの理由で、検索コントローラーがviewDidLoadで呼び出されていません。どんな考え?

Btw私はtableViewメソッドを追加しませんでした。これは、問題が発生していないためです。私がvar searchController: UISearchController!にブレークポイントを置くと、ヒットします。

Inside viewDidLoad私がsearchController(anything)にブレークポイントを置くと、問題がどこにあるのかが分かりません。

Inside numberOfRowsInSection...let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndexにブレークポイントを設定し、continueを押すと、selectedScopeButtonIndexがNil値を返すため、ここでクラッシュします。私はviewDidLoadで呼び出されていないので、それが無かったことに気づいた。self.searchController.searchBar.scopeButtonTitles = ["Sneaker Name","Sneaker Condition"]

なぜ私のsearchControllerを呼び出さないのですか?

class SearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate { 

@IBOutlet weak var tableView: UITableView! 

var searchController: UISearchController! 

var userContent = [Sneakers]() 
var filteredSearchSneakerNames = [Sneakers]() 
var filteredSearchSneakerConditions = [Sneakers]() 

override func viewDidLoad() { 
     super.viewDidLoad() 

     let backgroundColor = UIView(frame: CGRectZero) 
     self.tableView.tableFooterView = backgroundColor 

     //Nothing below this comment inside viewDidLoad is being called 
     self.tableView.backgroundColor = UIColor.whiteColor() 
     self.searchController = UISearchController(searchResultsController: nil) 
     self.searchController.delegate = self 
     self.searchController.searchBar.delegate = self 
     self.searchController.searchResultsUpdater = self 
     self.searchController.searchBar.showsCancelButton = true 
     self.searchController.searchBar.placeholder = "Search..." 
     self.searchController.searchBar.scopeButtonTitles = ["Sneaker Name","Sneaker Condition"] 
     self.searchController.searchBar.returnKeyType = .Done 
     self.navigationItem.hidesBackButton = true 
     self.searchController.dimsBackgroundDuringPresentation = false 
     self.navigationItem.titleView = searchController.searchBar 
     self.searchController.hidesNavigationBarDuringPresentation = false 
     self.definesPresentationContext = true 
     self.searchController.searchBar.sizeToFit() 
     self.tableView.tableHeaderView = self.searchController.searchBar 
     self.tableView.reloadData() 
    } 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    //I put a breakpoint here and it crashes 
    let scopeButtonIndex = self.searchController.searchBar.selectedScopeButtonIndex 

    if scopeButtonIndex == 0{ 
     return self.filteredSearchSneakerNames.count 
    }else{ 
     return self.filteredSearchSneakerConditions.count 
    } 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath...){ 
... 
} 

deinit{ 
     self.searchController = nil 
    } 

} 

彼らは何の問題を持っていないので、私はupdateSearchResultsForSearchControllerまたは他のsearchControllerの方法のいずれにも追加しませんでした。

答えて

2

これらの2行をviewDidLoadの最後に移動してみます。あなたのテーブルビューは、ストーリーボードからIBOutletとして来ています。つまり、viewDidLoadの前に準備ができていて、tableviewのメソッドtableFooterViewを呼び出すと、tableView:cellForRowAtIndexPathメソッドがトリガーされます。あなたのself.searchControllerはまだこの時点でセットアップされていないので、あなたはnilとcrashを得るでしょう。これらの2行を最後に移動すると、データソースが利用可能になった後でテーブルビューの操作が開始されます(この場合はsearchController)。

let backgroundColor = UIView(frame: CGRectZero) 
self.tableView.tableFooterView = backgroundColor 

また、あなたが真の場合numberOfRowsInSectionに0を返し、self.searchController.searchBar.selectedScopeButtonIndexにはnilをチェックすることができ、これはクラッシュを回避します。 self.tableView.reloadData()に電話すると、numberOfRowsInSectionが再度トリガーされ、今回はself.searchController.searchBar.selectedScopeButtonIndexが準備完了になります。

関連する問題