2015-07-10 6 views
0

У меня есть 2 массива. Один для всех автомобилей, другой - фильтр. filtersVehicles, динамически генерируемое поисковой панелью, и работает хорошо. Но я не могу динамически переходить к следующей сцене.UITableView и панель поиска с Segue

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView) 
    } 

и

// In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "DisplayViewSegue" { 
      let nextScene = segue.destinationViewController as! DisplayViewController 


      if sender as! UITableView == self.searchDisplayController!.searchResultsTableView { 
       let indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow()! 
       let selectedVehicle = self.filteredVehicles[indexPath.row] 
       nextScene.currentVehicle = selectedVehicle 
      } else { 
       let indexPath = self.tableView.indexPathForSelectedRow()! 
       let selectedVehicle = self.vehicles[indexPath.row] 
       nextScene.currentVehicle = selectedVehicle 
      } 


     } 
    } 

Это мои методы, относящиеся сделать SEGUE. Когда я нажимаю любой объект списка таблиц App является брокерским и получение такого рода ошибки:

Could not cast value of type 'UITableViewCell' (0x10757f9f0) to 'UITableView' (0x10757a810). (lldb)

ответ

1

Я считаю, что вы создали SEGUE в раскадровку из ячейки таблицы представления на ваш следующая сцена. Выполняя это, ваш сеанс выполняется автоматически, и вам не нужно звонить self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView)

Проблема, конечно, в том, что отправитель является ячейкой таблицы, а не табличным видом, как вы бы предпочли. У вас есть несколько вариантов:

  1. удалить содержимое вашего didSelectRowAtIndexPath, а внутри prepareForSegue, получить ссылку на таблицу просмотра какой-то другой путь.
  2. обновите свою раскадровку, изменив segue, чтобы исходить из самого контроллера представления, а не ячейки таблицы. Это позволит вам позвонить performSegueWithIdentifier внутри вашего метода didSelectRowAtIndexPath.
0

Похоже, что отправитель является представление ячейки таблицы вы нажали, так что вы не должны делать вынужденное преобразование здесь. (В общем, рекомендуется избегать использования как!)

Я бы предложил поставить логику выбора транспортного средства в didSelectRowAtIndexPath. Если у вас есть тип называется Vehicle что-то вроде бы работать:

var selectedVehicle: Vehicle? 
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if tableView == searchDisplayController?.searchResultsTableView { 
     selectedVehicle = filteredVehicles[indexPath.row] 
    } else { 
     selectedVehicle = vehicles[indexPath.row] 
    } 
    self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView) 
} 

Это упрощает реализацию prepareForSegue

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "DisplayViewSegue" { 
     if let nextScene = segue.destinationViewController as? DisplayViewController { 
      nextScene.currentVehicle = selectedVehicle 
     } 
    } 
} 
Смежные вопросы