以编程方式取消segue

4
我正在显示一个带有UITableView控件的UIView。我使用Show segue通过调用performSegueWithIdentifier来显示此视图。在调用segue的模块中,我添加了一个函数,希望在返回segue时使用它来检索一些数据。目前,我有一个已经与调用者上的函数关联的Done按钮,以便在回收时从segue中检索数据。但是,我想在UITableView中选择项目时执行此操作,而不是在点击Done按钮时执行。
在tableView(,willSelectRowAtIndexPath)中,我尝试调用popViewControllerAnimated。第二个UIView确实关闭并将我带回到调用的UIView,但未调用unwind函数。
我知道如何设置done按钮的unwind,使用Exit,但我无法弄清楚如何在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
}

当我点击“完成”时,取消代码确实会执行。但是当我选择表格中的项目时,什么也没有发生。


代码已添加。 - Scott
1个回答

4
您可以为整个视图控制器创建反向退场(segue)。要执行此操作,请将segue从视图控制器对象拖动到退出(Exit)对象。
创建segue后,它会列在文档大纲中。
选择它并在属性检查器中为其指定标识符。然后在您的代码中,当tableview选择一个单元格时,像任何其他普通segue一样执行此segue。
请注意保留HTML标记。
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函数中,然后它就起作用了。 - Scott
如果需要将数据传递给第一个视图控制器,则必须重写 prepareForSegue。 - mustafa
1
为什么我无法从视图控制器对象拖动segue到退出对象? - TomSawyer
你需要右击并从视图控制器向退出拖动。 - mustafa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接