2014-12-02 1 views
1

У меня есть простой код:prepareForSegue ошибка резьбы 1: EXC_BREAKPOINT (код = EXC_I386_BPT, субкодовое = 0x0)

var searchResults1: [(name:String, description:String)]=[] 
var searchResults2: [(name:String, description:String)]=[] 
var searchResults3: [(name:String, description:String)]=[] 

var situation1 = [(name: "qq", description: "ww"), (name: "ee", description: "rr"), (name: "tt", description: "yy"), (name: "aa", description: "ss")] 
var situation2 = [(name: "qq", description: "ff"), (name: "gg", description: "hh"), (name: "jj", description: "kk"), (name: "ll", description: "ii")] 
var situation3 = [(name: "zz", description: "xx"), (name: "cc", description: "vv"), (name: "bb", description: "nn"), (name: "mm", description: "as"), (name: "we", description: "sd"), (name: "xc", description: "gf")] 

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
{ 
    switch section { 
    case 0: 
     return "I" 
    case 1: 
     return "II" 
    case 2: 
     return "III" 
    case 3: 
     return "IV" 
    case 4: 
     return "V" 
    case 5: 
     return "VI" 
    case 6: 
     return "VII" 
    case 7: 
     return "VIII" 
    case 8: 
     return "IX" 
    case 9: 
     return "X" 
    case 10: 
     return "XI" 
    case 11: 
     return "XII" 

    default: 
     return nil 
    } 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
{ 
    return 12 
} 
override func tableView(tableView: UITableView, cellForRowAtIndexPath 
indexPath: NSIndexPath) -> UITableViewCell { 
    let identifier = "cell" 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? UITableViewCell 

    if cell == nil { 
      cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: identifier) 
     } 

    if (indexPath.section == 0) { 

     if tableView == self.searchDisplayController!.searchResultsTableView { 
      cell!.textLabel.text = searchResults1[indexPath.row].name 

     } else { 
      cell!.textLabel.text = situation1[indexPath.row].name 



     } 

     return cell! 
    } 


    if (indexPath.section == 1) { 

     if tableView == self.searchDisplayController!.searchResultsTableView { 
      cell!.textLabel.text = searchResults2[indexPath.row].name 

     } else { 
       cell!.textLabel.text = situation2[indexPath.row].name 

     } 
     return cell! 
    } 

    if (indexPath.section == 2) { 

     if tableView == self.searchDisplayController!.searchResultsTableView { 
      cell!.textLabel.text = searchResults3[indexPath.row].name 

     } else { 

     cell!.textLabel.text = situation3[indexPath.row].name 

     } 
     return cell! 
    } 
    return cell! 
} 

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

      return situation1.count } 


    case 1: 
     if tableView == self.searchDisplayController!.searchResultsTableView { 
      return self.searchResults2.count 
     } else { 
      return situation2.count } 

    case 2: 

     if tableView == self.searchDisplayController!.searchResultsTableView { 
      return self.searchResults3.count 
     } else { 
      return situation3.count } 

      default: 
     return 0 
     } 
    } 




func filterContentForSearchText (searcText: String) { 

    searchResults1 = situation1.filter{($0.name as NSString).localizedCaseInsensitiveContainsString("\(searcText)")} 
    searchResults2 = situation2.filter{($0.name as NSString).localizedCaseInsensitiveContainsString("\(searcText)")} 
    searchResults3 = situation3.filter{($0.name as NSString).localizedCaseInsensitiveContainsString("\(searcText)")} 
} 


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

override func tableView(tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath){ 
    if tableView == self.searchDisplayController!.searchResultsTableView { 
     self.performSegueWithIdentifier("showDetail", sender: self) 
    } 

} 

Это была работа хорошая.

Когда я нажимаю на выходе ошибки ячейки searchResultsTableView: Тема 1: EXC_BREAKPOINT (код = EXC_I386_BPT, субкодовое = 0x0)

Пример кода функции prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject!) { 
    if segue.identifier == "showDetail" { 
     let cell = sender as UITableViewCell 
     var indexPath = tableView.indexPathForCell(cell)! 

     switch (indexPath.section) { 
     case 0: 

      if self.searchDisplayController!.active { 
       var indexPath = tableView.indexPathForSelectedRow() 
       indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow() 
       var destViewController: DetailViewController = segue.destinationViewController as DetailViewController 
       destViewController.title = searchResults1[indexPath!.row].name 
       destViewController.situation = searchResults1[indexPath!.row] 
      } 
      else { 
       var indexPath = tableView.indexPathForSelectedRow() 
       let destViewController:DetailViewController! = segue.destinationViewController as DetailViewController 
       destViewController.title = situation1[indexPath!.row].name 
       destViewController.situation = situation1[indexPath!.row] 
      } 
     case 1: 
      if self.searchDisplayController!.active { 
       var indexPath = tableView.indexPathForSelectedRow() 
       indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow()! 
       var destViewController: DetailViewController = segue.destinationViewController as DetailViewController 
       destViewController.title = searchResults2[indexPath!.row].name 
       destViewController.situation = searchResults2[indexPath!.row] 

      } 
      else { 
       var indexPath = tableView.indexPathForSelectedRow() 
       let destViewController:DetailViewController! = segue.destinationViewController as DetailViewController 
       destViewController.title = situation2[indexPath!.row].name 
       destViewController.situation = situation2[indexPath!.row] 
      } 

     default: 
      break 
     } 


     } 

Можете ли вы предложить, как я должен изменить функция prepareForSegue?

Ссылка проекта в DropBox https://www.dropbox.com/sh/3yeowjurweo3xdo/AAAh7S-N89XPSqi-Xr8M5WmPa?dl=0

Спасибо!

+0

Когда вы получаете исключение брошено, это действительно полезно, чтобы обеспечить полную трассировку стека (как показано на отладочной навигатора) и указать строку, где происходит исключение. –

ответ

0

Попробуйте это:

 1. self.performSegueWithIdentifier("showDetail", sender: cell!) 

    2. if segue.identifier == "showDetail" { 


     let cell = sender as UITableViewCell 

     var ip = tableView.indexPathForCell(cell); 
     if (ip == nil) { 
      ip = self.searchDisplayController!.searchResultsTableView.indexPathForCell(cell); 
     } 

     var indexPath = ip! 
     switch (indexPath.section) { 
     case 0: 
0

Ваш performSegueWithIdentifier вызов проходит self как sender параметра:

self.performSegueWithIdentifier("showDetail", sender: self) 

prepareForSegue Ваш метод ожидает отправителя быть UITableViewCell:

let cell = sender as UITableViewCell 

Так что я предполагаю, что авария на этой линии , в котором листинг будет терпеть неудачу, так как ваш производный от UITableView класс не будет закрыт для UITableViewCell.

+0

Спасибо за ответ. Что мне делать, чтобы создать мост между результатами поиска и DetailViewController? –

+0

Ну, вы должны, вероятно, искать нужную ячейку с помощью 'cellForRowAtIndexPath' и передавать это как отправитель' performSegueWithIdentifier' или просто использовать 'indexPathForSelectedRow' в' prepareForSegue', чтобы искать выбранную строку напрямую, а чем использовать «отправителя» ... На самом деле. –

+0

Спасибо! Получили следующие функции:! если self.searchDisplayController .active { вар indexPath = tableView.indexPathForSelectedRow() indexPath = self.searchDisplayController .searchResultsTableView.indexPathForSelectedRow() вар destViewController: DetailViewController = segue.destinationViewController в DetailViewController destViewController .situation = searchResults1 [indexPath! .row] } –

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