如何以编程方式添加segue?

时间:2015-12-28 14:02:13

标签: ios iphone swift uitableview

我知道,我知道这已被问过很多次。我还发现this question,但它建议的解决方案对我不起作用。

我只是想构建一个应用来演示如何在UIKit中使用这些东西(以防我以后想要使用它们。我可以复制代码)。

我创建了一个带有表格视图的View Controller。我写了一个名为PrototypeTableController的类,作为我在故事板中创建的视图控制器的视图控制器类。

当用户点击其中一个单元格时,我希望显示另一个视图控制器,称为Prototype Table Content。如果点击不同的单元格,将显示不同的文本。

在故事板中,它是这样的:

enter image description here

当用户点击不同的单元格时,Prototype Table Content中的标签文本会有所不同。这意味着我需要将数据从一个视图控制器发送到另一个视图控制器。

上面提到的帖子表明我应该给segue一个标识符,所以我做了:

enter image description here

这是我的代码:

查看表视图的控制器类:

class PrototypeTableController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let data = ["Cell1", "Cell2", "Cell3", "Cell4", "Cell5"]
    let contents = ["Hello", "Nice", "OMG", "Jesus", "Peace"]
    var content: String?

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

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }

    func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        return "This is a prototype table view created by Sweeper"
    }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return "my table"
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        content = contents[indexPath.row]
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        performSegueWithIdentifier("showContent", sender: tableView)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showContent" {
            let destination = segue.destinationViewController as! PrototypeTableContentViewController
            destination.contentString = content
        }
    }
}

查看Prototype Table Content视图的控制器类:

class PrototypeTableContentViewController: UIViewController {
    @IBOutlet var tableContent: UILabel!
    var contentString: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        tableContent.text = contentString
    }
}

我想我做了上面提到的帖子中建议的所有事情。我添加了一个标识符,我调用了performSegueWithIdentifier ,我也在点击后取消选择了细胞。

然而,它只是没有去其他视图控制器!它停留在同一个控制器上!像这样:

enter image description here

2 个答案:

答案 0 :(得分:3)

确保您的tableview委托已设置。如果您使用的是故事板,请确保故事板中的委托插座已正确连接。如果您是按代码创建tableview,那么您应该tableView.delegate=self;来设置委托。

你的代码很好。

还有一件事:

您可能需要更改此行:

     performSegueWithIdentifier("showContent", sender: tableView)

你需要将发件人作为行而不是tableview,以便准备segue将发件人作为行而不是整个tableview。

当您调用prepareForSegue加班时选择一行时,在executeSegueWithIdentifier中将该行设置为发送者是有意义的。

所以它会是:

            let row=indexPAth.row
          performSegueWithIdentifier("showContent", sender: row)

答案 1 :(得分:3)

  

当用户点击其中一个单元格时,我想要显示另一个视图控制器,称为原型表内容。如果点击不同的单元格,将显示不同的文本。

虽然您可以通过编程方式拨打performSegueWithIdentifier,但故事板可以为您自动处理这些工作。只需使用原型单元格中的show故事板segue到PrototypeTableContentViewController

prepareForSegue知道您选择了哪个单元格,因为该单元格是发件人。您所要做的就是设置目标视图控制器的contentString。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    guard let controller = (segue.destinationViewController as? PrototypeTableContentViewController where segue.identifier == "showContent", let cell = sender as? UITableViewCell, textLabel = cell.textLabel else {
        return
    }

    controller.contentString = textLabel.text
}

这与像Master-Detail这样的模板如何从单元格中显示以显示有关单元格的详细信息非常类似(尽管Apple使用indexPathForSelectedRow来传递单元格的详细信息):

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row] as! NSDate
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
            controller.detailItem = object
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

在任何一种情况下,SDK都会为您执行storyboard segue;不需要以编程方式添加或执行segue。

相关问题