2014-09-27 2 views
0

im делает простой проект в Xcode 6, и я хочу добавить панель поиска в tableviewcontroller, но что-то не работает для меня. Я делаю это с помощью этого учебника http://www.raywenderlich.com/76519/add-table-view-search-swiftПанель поиска в таблице View Swift

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if tableView == self.searchDisplayController!.searchResultsTableView { 
     return self.filteredProgramy.count 
    } else { 
     return self.programy.count 
    } 
} 

здесь им получать ошибки «неустранимая ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение». idk почему. Весь код здесь

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if tableView == self.searchDisplayController!.searchResultsTableView { 
     return self.filteredProgramy.count 
    } else { 
     return self.programy.count 
    } 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell 

    var program : Program 

    if tableView == self.searchDisplayController!.searchResultsTableView { 
     program = filteredProgramy[indexPath.row] 
    } else { 
     program = programy[indexPath.row] 
    } 


func filterContentForSearchText(searchText: String) { 
    // Filter the array using the filter method 
    var scope = String() 
    self.filteredProgramy = self.programy.filter({(program: Program) -> Bool in 
     let categoryMatch = (scope == "All") || (program.category == scope) 
     let stringMatch = program.name.rangeOfString(searchText) 
     return categoryMatch && (stringMatch != nil) 
    }) 
} 

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool { 
    self.filterContentForSearchText(searchString) 
    return true 
} 

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool { 
    self.filterContentForSearchText(self.searchDisplayController!.searchBar.text) 
    return true 
} 

}

+1

Эта ошибка не имеет ничего делать с панелью поиска конкретно и имеет отношение к пониманию того, как правильно использовать дополнительные опции. В какой строке вы получаете ошибку? Вероятно, вы принудительно разворачиваете необязательное значение и получаете нуль (как описано в сообщении об ошибке). –

+0

здесь. "if tableView == self.searchDisplayController! .searchResultsTableView {" – patrikbelis

+0

Вы получили это разобранное? –

ответ

1

self.searchDisplayController равна нулю.

Я только что загрузил образец кода учебника (который вы также должны сделать), и я вижу, что у автора есть «Контроллер отображения отображения» в своем файле nib. Проверьте файл nib и убедитесь, что контроллер Candy Search подключен правильно.

Это должно выглядеть следующим образом:

enter image description here

Чтобы получить к этому изображению правой кнопкой мыши на Search Display Controller объекта в файле .xib. Обратите внимание на мое изображение, что «Ссылка на розетки» имеет соединение между searchDisplayController и CandySearch. Это то, чего вам не хватает.

Для создания соединения CTRl сопротивления от контроллера CandySearch в `Search Display Controller», когда вы отпускаете мыши вы увидите:

enter image description here

Нажмите searchDisplayController, и вы должны быть хорошо идти .

Наконец, вы должны прочитать о том, как работать в OPTIONALS Swift, чтобы помочь вам понять проблемы, как это в будущем:

https://developer.apple.com/librarY/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_456

-1

У меня была аналогичная проблема, и я нашел следующее для работы. «Клетка» переменная в коде равна нулю, потому что в то время как вы установили количество строк, реальный объект ячейки еще не была создана (клеточная линия = UITableView (.. ниже)

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell : UITableViewCell 
    var player : Player 

    if self.searchDisplayController!.active { 
     var searchCell: AnyObject? = self.tableView.dequeueReusableCellWithIdentifier("Cell") 

     if searchCell == nil { 
      cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") 
     } else { 
      cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell 
     }    

     player = self.filteredPlayers[indexPath.row] 
    } else { 
     cell = self.tableView.dequeueReusableCellWithIdentifier(TableCellNamesEnum.PLAYER_DETAIL_CELL.rawValue, forIndexPath: indexPath) as UITableViewCell 
     cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
     player = self.selectedPlayers[indexPath.row] 
    } 

    cell.textLabel!.text = "\(player.firstName) \(player.lastName)" 

    return cell 
} 
+0

Почему вы смешиваете использование 'dequeueReusableCellWithIdentifier (_ :)' и 'dequeueReusableCellWithIdentifier (_: forIndexPath :)'? почему вы бросаете 'searchCell' в' AnyObject' ?. и отбрасывание возвращаемого типа 'dequeueReusableCellWithIdentifier (_ :)' на 'UITableViewCell' не обязательно. – vikingosegundo

+0

В основном потому, что это был код, используемый в примере учебника для этой конкретной версии xCode :) – as21

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