Я использую 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()
}
}
Как создать экземпляр 'ResultsTableViewController'? – Paulw11
Да, да. Он называется resultTableViewController. –
Нет, я имею в виду показать код, в котором вы * создаете * этот экземпляр, или это ваш первоначальный контроллер представления. Симптомы, которые вы описываете, согласуются с тем, что вы не создаете контроллер вида из раскадровки. – Paulw11