Segue正在执行两次

Chr*_*ris 8 iphone xcode swift

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
   self.selectedClubState = stateNamesForDisplay[indexPath.row]
   self.performSegueWithIdentifier ("Cities", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var clubsToPassToCitiesViewController = [clubObject]()
    if segue.identifier == "Cities" {
        for club in clubsForTable{
            if club.clubState == self.selectedClubState{
                clubsToPassToCitiesViewController.append(club)
            }
        }
       let citiesView = segue.destinationViewController as? citiesViewController
       citiesView?.clubsForChosenCity = clubsToPassToCitiesViewController
   }
}
Run Code Online (Sandbox Code Playgroud)

Segue正在执行两次,导致下一个VC.我怎样才能防止这种情况发生?

mat*_*att 12

是两次执行segue的人 - 一次自动在故事板中(因为你的segue从单元格原型中发出了一个动作Segue),而在你说的时候就是代码self.performSegueWithIdentifier.如果您不希望segue执行两次,请删除其中一个.

就个人而言,我的建议是你didSelectRow完全删除并将你的self.selectedClubState作业转移到prepareForSegue.


Sha*_*des 11

删除故事板中的当前segue.然后按CTRL- 从viewController(不是单元格)拖动到下一个视图控制器并将其命名为"Cities".现在,当您选择一个单元格时,didSelectRowAtIndexPath()将首先触发并将调用performSegueWithIdentifier()

在此输入图像描述

但是,如果您要查找的didSelectRowAtIndexPath()是获取执行segue的行,则可以保持原始设置从故事板中删除单元格,删除didSelectRowAtIndexPath()prepareForSegue()执行:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let indexPath = self.tableView.indexPathForSelectedRow {
        self.selectedClubState = stateNamesForDisplay[indexPath.row]
    }
    var clubsToPassToCitiesViewController = [clubObject]()
    if segue.identifier == "Cities" {
        for club in clubsForTable{
            if club.clubState == self.selectedClubState{
                clubsToPassToCitiesViewController.append(club)
            }
        }
       let citiesView = segue.destinationViewController as? citiesViewController
       citiesView?.clubsForChosenCity = clubsToPassToCitiesViewController
   }
}
Run Code Online (Sandbox Code Playgroud)