2015-11-02 2 views
0

У меня есть tableView, который запускает segue для подробного просмотра при нажатии ячейки. Таблица содержит список пользователей, с которыми работает currentUser. Нажатие ячейки загружает представление для этого пользователя (имя, профиль и т. Д.). Это очень простое приложение, которое я создаю, чтобы научиться программировать.Segue не отправляет правильную информацию о ячейке в Swift

Проблема заключается в том, что когда я нажимаю на ячейку, она всегда загружает информацию о пользователе для последнего пользователя в таблице (а также бывает самым последним «другом», созданным пользователем). У меня есть ощущение, что проблема с если заявление я имею в функции Tableview:

extension MatchesViewController: UITableViewDataSource 
{ 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return numberOfMatches 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

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

     if PFUser.currentUser()!.objectId == self.user1.objectId{ 
      let user = matchesResults[indexPath.row]["user2"] as! PFUser 
      cell.textLabel?.text = user["first_name"] as! String 
      self.viewUser = user 
     } 

     if PFUser.currentUser()!.objectId == self.user2.objectId{ 
      let user = matchesResults[indexPath.row]["user1"] as! PFUser 
      cell.textLabel?.text = user["first_name"] as! String 
      self.viewUser = user 
     } 

     return cell 
    } 

    } 

Вот код Segue, но я не думаю, что есть проблема с ним (хотя я могу ошибаться) :

extension MatchesViewController: UITableViewDelegate 
{ 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     self.performSegueWithIdentifier("UserSegue", sender: "viewUser") 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if (segue.identifier == "UserSegue") { 
      let destinationVC = segue.destinationViewController as! UserViewController 
      destinationVC.user = self.viewUser 
     } 
    } 

    } 

Любые идеи? Если есть проблема с моей командой tableView If, как я могу ее исправить?

Спасибо!

ответ

1

Вы можете получить user объект, indexPath, чем передать его через параметр метода performSegueWithIdentifiersender

extension MatchesViewController: UITableViewDelegate 
{ 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     let user:PFUser? 
     if PFUser.currentUser()!.objectId == self.user1.objectId{ 
      user = matchesResults[indexPath.row]["user2"] as! PFUser 
     } 

     if PFUser.currentUser()!.objectId == self.user2.objectId{ 
      user = matchesResults[indexPath.row]["user1"] as! PFUser 
     } 
     self.performSegueWithIdentifier("UserSegue", sender: user) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // sender is the user object 
     if (segue.identifier == "UserSegue") { 
      let destinationVC = segue.destinationViewController as! UserViewController 
      destinationVC.user = sender // maybe you need cast sender to UserObject 
     } 
    } 

} 
+0

Спасибо за ответ! Я получаю «фатальную ошибку: неожиданно нашел нуль при распаковке необязательного значения» в строке 'let user = cell! .tag'. – winston

+0

Почему «cell» nil? Вы выбираете ячейку, я думаю, вы должны получить выбранную ячейку. – t4nhpt

+0

Я поменял 'let cell' обратно на' let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier («MatchCell», forIndexPath: indexPath) ', но я сохранил другие строки вашего решения, и, похоже, это немного улучшило меня. Когда я загружаю tableView, XCode по какой-то причине переходит к пользователю View без нажатия ячейки и показывает нулевую ошибку на метке имени пользователя – winston