【问题标题】:How to add a segue programmatically?如何以编程方式添加segue?
【发布时间】:2016-04-02 09:19:35
【问题描述】:

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

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

我创建了一个视图控制器,其中包含一个表视图。我编写了一个名为PrototypeTableController 的类来充当我在情节提要中创建的视图控制器的视图控制器类。

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

在故事板中是这样的:

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

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

这是我的代码:

表格视图的视图控制器类:

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 ,我也取消了点击后的单元格。

但是,它只是没有转到其他视图控制器!它保持在同一个控制器上!像这样:

【问题讨论】:

  • 推送视图控制器而不是以编程方式添加 segue
  • 当表没有导航控制器@DivyanshuSharma时,不会发生推送
  • 我有一个导航视图控制器! @Mr.T
  • 你放断点了吗?是否为 segue 做准备?
  • 如果 segue!.identifier == 或 if( segue.identifier == ) 试试这个

标签: ios iphone swift uitableview


【解决方案1】:

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

虽然您可以通过编程方式调用performSegueWithIdentifier,但情节提要可以自动为您处理很多工作。只需使用 show 故事板从原型单元转到 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 都会为您执行故事板转场;不需要以编程方式添加或执行 segue。

【讨论】:

    【解决方案2】:

    确保您的 tableview 委托已设置。如果您使用情节提要,请确保情节提要中的委托插座已正确连接。如果您是通过代码创建 tableview,那么您应该使用tableView.delegate=self; 来设置委托。

    你的代码没问题。

    还有一件事:

    您可能需要更改此行:

         performSegueWithIdentifier("showContent", sender: tableView)
    

    您需要将发件人设置为行而不是表视图,以便为 segue 做准备将发件人作为行而不是整个表视图。

    当您调用 prepareForSegue 超时时,您选择了一行,在 performSegueWithIdentifier 中将该行设置为发件人是有意义的。

    原来是这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多