以编程方式展开 segue

Posted

技术标签:

【中文标题】以编程方式展开 segue【英文标题】:Programmatically unwind segue 【发布时间】:2015-06-13 04:21:20 【问题描述】:

我正在显示一个带有 UITableView 控件的 UIView。我通过调用 performSegueWithIdentifier 以 Show segue 显示此视图。在调用 segue 的模块中,我添加了一个我想在展开时使用的函数,以便在从 segue 返回时从视图中检索一些数据。现在,我有一个 Done 按钮,它连接到调用者的函数,这样我可以在 segue 展开时从 segue 中检索数据。我不想在点击完成按钮时执行所有这些操作,而是希望在 UITableView 中选择一个项目时执行此操作。

在 tableView(,willSelectRowAtIndexPath) 中,我尝试调用 popViewControllerAnimated。第二个 UIView 确实关闭并将我带回调用 UIView,但未调用展开函数。

我知道如何从完成按钮设置展开,使用退出,但我不知道如何在点击 UITableView 中的一行时做到这一点。

这是我用来执行 segue 的代码:

    @IBAction func fromButtonTap(sender: AnyObject) 
    currentButton = sender.tag

    self.performSegueWithIdentifier("UnitsSegue", sender: self)

这是解开 segue 时执行的代码:

@IBAction func returnFromUnitSelection(segue: UIStoryboardSegue) 
    var buttonToSet: UIButton!
    var unitsToSet: UnitData!

    fromLabel.text = "0"
    toLabel.text = "0"

    if let unitsSelectionViewController = segue.sourceViewController as? UnitSelectionController 
        if currentButton == 0 
            fromUnitData = unitsSelectionViewController.selectedUnit
            buttonToSet = fromButton
        
        else 
            toUnitData = unitsSelectionViewController.selectedUnit
            buttonToSet = toButton
        

        setButtonText(buttonToSet, firstLine: unitsSelectionViewController.selectedUnit.unitCode, secondLine: unitsSelectionViewController.selectedUnit.unitName, firstLineFontSize: 15, secondLineFontSize: 11)
    

这是我用来关闭第二个 UIView 的代码:

    func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? 
    selectedUnit = temperatures[indexPath.row]
    self.navigationController?.popViewControllerAnimated(true)

    return indexPath

当我点击完成时,展开代码会执行。但是当我在我的表中选择一个项目时没有任何反应。

【问题讨论】:

已添加代码。 【参考方案1】:

您可以为整个视图控制器创建展开转场。为此,将 segue 从视图控制器对象拖动到退出对象。

segue 创建后会在文档大纲中列出。

选择它并在属性检查器中给它一个标识符。然后在你的代码中,当 tableview 选择一个单元格时,像任何其他正常的 segue 一样执行这个 segue。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    let title = tableView.cellForRowAtIndexPath(indexPath)?.textLabel?.text

    performSegueWithIdentifier("backToViewController1", sender: title)

然后重写prepareForSegue 方法将数据传递给第一个视图控制器。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let identifier = segue.identifier where identifier == "backToViewController1",
       let destination = segue.destinationViewController as? ViewController,
           selectedTitle = sender as? String 
        destination.selectedCountryTitle = selectedTitle
    

【讨论】:

谢谢。这行得通。我不必重写 prepareForSegue。当我从视图中拖动退出时,会显示一个带有我的展开功能的弹出窗口。我不太确定它为什么或如何知道显示该特定功能。我选择了它并将 performSegueWithIdentifier 放在我的 tableView 函数中,它起作用了。 如果您需要将数据传递给第一个视图控制器,则需要覆盖 prepareForSegue 为什么我不能将 segue 从视图控制器对象拖到退出对象? 您必须右键单击并从视图控制器拖动才能退出

以上是关于以编程方式展开 segue的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式展开 Segue - 新的转折

Swift 以编程方式创建一个 unwind segue

无法以编程方式执行 unwind segue

在单元测试中以编程方式执行 Unwind Segue

如何以编程方式创建展开转场[重复]

展开后执行segue