2016-09-10 5 views
1

Я использую UISearchController в моем проекте. Я запускаю контроллер поиска, поставляя метод init(searchResultsController) с объектом UIViewController, который управляет табличным представлением. Код для этого объекта:Почему моя переменная tableView возвращает nil?

import UIKit 

class ResultsTableViewController: UIViewController { 

@IBOutlet weak var tableView: UITableView! 
var list: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 
} 

extension ResultsTableViewController: UITableViewDelegate{} 

extension ResultsTableViewController: UITableViewDataSource{ 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return list.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") 

    if cell == nil { 
     cell = UITableViewCell(style: .Default, reuseIdentifier: "Cell") 
     cell?.textLabel?.text = list[indexPath.row] 
     } else { 
     cell?.textLabel!.text = list[indexPath.row] 
     } 
     return cell! 
    } 
} 

Кроме того, когда я пытаюсь получить доступ к resultsTableViewController.tableView из updateSearchResultsForSearchController(searchController: UISearchController) метода протокола UISearchResultsUpdating для заполнения его «список» массива, он дает мне ошибку. TableView возвращает nil, и приложение падает. Я хотел бы отметить, что я подключил источник данных, делегат и переменную IBOutlet tableView к соответствующему контроллеру представления. Я надеялся, что кто-то объяснит мне, почему это происходит? Я думаю, что у меня есть недоразумение в жизненном цикле ResultsTableViewController. Наконец, когда я перетаскиваю TableViewController из раскадровки вместо того, чтобы создавать свой собственный контроллер табличного представления с нуля, все работает плавно без каких-либо ошибок! Не могли бы вы помочь мне понять, что здесь происходит?

Edit: Код для моего первого контроллера представления является:

import UIKit 

class FirstViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 
    var resultsTableViewController = ResultsTableViewController() 
    var searchController: UISearchController! 
    let list = ["Apple", "Orange", "Bananas","Kiwi", "Cucumbers", "Apricot","Peach", "Cherry", "Mangosteen","Strawberry", "Blueberry", "Raspberry","Watermelon", "Persimmon", "plums","Papaya", "Jackfruit", "Lichi"] 
    var filteredList: [String]! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     setUpSearchController() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func setUpSearchController(){ 
     searchController = UISearchController(searchResultsController: resultsTableViewController) 
     searchController.dimsBackgroundDuringPresentation = false 
     searchController.searchResultsUpdater = self 
     searchController.hidesNavigationBarDuringPresentation = true 
     tableView.tableHeaderView = searchController.searchBar 
     tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false) 
    } 

} 

extension FirstViewController: UITableViewDelegate, UITableViewDataSource{ 

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

     return list.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     var cell = tableView.dequeueReusableCellWithIdentifier("cell") 
     if cell == nil { 
      cell = UITableViewCell(style: .Default, reuseIdentifier: "cell") 
      cell?.textLabel?.text = list[indexPath.row] 
     }else { 
      cell?.textLabel?.text = list[indexPath.row] 
     } 
     return cell! 
    } 

} 

extension FirstViewController: UISearchResultsUpdating{ 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     filteredList = list.filter({ 
      item in 
      return item.containsString(searchController.searchBar.text!) 
     }) 
     resultsTableViewController.list = filteredList 
     resultsTableViewController.tableView.reloadData() 
    } 
} 
+0

Как создать экземпляр 'ResultsTableViewController'? – Paulw11

+0

Да, да. Он называется resultTableViewController. –

+0

Нет, я имею в виду показать код, в котором вы * создаете * этот экземпляр, или это ваш первоначальный контроллер представления. Симптомы, которые вы описываете, согласуются с тем, что вы не создаете контроллер вида из раскадровки. – Paulw11

ответ

2

var resultsTableViewController = ResultsTableViewController()

создает новый ResultsTableViewController, но это не связано с вашей раскадровки сцены, так что ни один из @IBOutlet с не будет задавать. Вам нужно установить идентификатор для сцены (скажем resultsViewController), а затем использовать его для конкретизации контроллер представления из раскадровки:

var resultsTableViewController: ResultsTableViewController! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setUpSearchController() 
} 

func setUpSearchController(){ 

    let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil) 
    self.resultsTableViewController = storyboard.instantiateViewControllerWithIdentifer("resultsViewController") as! ResultsTableViewController 

    searchController = UISearchController(searchResultsController: resultsTableViewController) 
    searchController.dimsBackgroundDuringPresentation = false 
    searchController.searchResultsUpdater = self 
    searchController.hidesNavigationBarDuringPresentation = true 
    tableView.tableHeaderView = searchController.searchBar 
    tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false) 
} 
+0

У меня есть диспетчер представлений (с табличным представлением в нем) в моей раскадровке, в которой идентификатор ResultsTableViewController является его идентификатором. Так что я думаю, что он правильно подключен к раскадровке? @ Paulw11 –

+0

Да, но когда вы говорите «var resultsTableViewController = ResultsTableViewController()», он ничего не использует из раскадровки, он просто создает «пустой» экземпляр класса, поэтому ваши выходные точки равны нулю. Вам нужно использовать 'instantiateViewControllerWithIdentifier', как я показал, чтобы объекты были подключены. – Paulw11

+0

Omg! это сработало! Благодарю. @ Paulw11 –

Смежные вопросы