didSelectRowAtIndexPath和performSegueWithIdentifier

时间:2015-11-18 02:50:06

标签: swift2 segue

我有一个显示单元格列表的tableView。我需要捕获所选单元格,并根据indexPath.row传递我的对象数据,以在我的第二视图控制器上显示它。我的didSelectRowAtIndexPath工作正常,但我可能不熟悉performSegueWithIdentifier的语法,因为它无法调用该方法。

对不起,我是Swift编程的新手,如果您能解释更多细节,我们将不胜感激。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
    selectedCell = indexPath.row
    performSegueWithIdentifier("DetailScreen", sender: self)
}

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
    detailedView.personName = personList[selectedCell].GetPersonName()
}

2 个答案:

答案 0 :(得分:1)

解决方案1 ​​

首先,确保您的第一个和第二个视图控制器之间存在segue(从表视图控制器1到详细信息视图屏幕)。确保segue具有名称

enter image description here

现在在你的第一个视图控制器的didSelectRowAtIndexPath事件中,像这样调用segue。

performSegueWithIdentifier("DetailScreen", sender: nil)

现在,在第一个视图控制器的prepareForSegue方法中,您可以对其进行自定义以发送更多详细信息。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{       
   if(segue.identifier=="DetailScreen")
   {
     let ctrl = segue.destinationViewController as! YourDetailsViewController
     ctrl.personName = "Set some person name here"
   }
}

假设您的详细信息屏幕的类名为YourDetailsViewController,并且它具有一个名为personName的字符串类型的属性。您可以更新代码以使用真实的视图控制器。

解决方案2

如果您不想创建segue,可以通过编程方式导航(实际上将第二个视图控制器推到前面)到第二个视图。在你的第一个视图控制器中,didSelectIndexPathAtRow方法,

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){

  let ctrl = self.storyboard?.instantiateViewControllerWithIdentifier("DetailsCtrl")
                                      as? YourDetailsViewController

  ctrl?.personName="Set some name here"

  self.navigationController?.pushViewController(ctrl!, animated: true)
}

要使上述代码生效,您需要确保在第二个视图控制器上将StoryBoardID设置为“DetailsCtrl”(详细信息视图)

enter image description here

答案 1 :(得分:0)

您已将故事板segue设置如下:

单击segue并添加标识符

enter image description here

您可以使用以下代码达到上述要求,这对我有用:

   func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
        let storyboard1 = UIStoryboard(name: "Main", bundle: nil)

        let detail = storyboard1.instantiateViewControllerWithIdentifier("DetailScreen") as! SecondViewController
        detail.personName = personList[selectedCell].GetPersonName()
        self.navigationController?.pushViewController(detail, animated: true)
 }

从第一个视图控制器到第二个视图控制器的故事板应该是“推送”。

希望这可能会有所帮助。