人工触发 Segue

Posted

技术标签:

【中文标题】人工触发 Segue【英文标题】:Trigger Segue Artificially 【发布时间】:2015-03-05 15:25:40 【问题描述】:

我正在尝试使用 Swift 在 OS X 故事板应用程序中的两个 viewContoller 之间传递数据。当我按下 VC1 上的按钮时,它会打开 VC2,然后运行 ​​prepareForSegue。但是,我无法将数据传回 VC1,因为 a. prepareForSegue 没有运行(因为没有打开一个窗口)和 b。因为即使是这样,VC1 也不知道正在发送数据,而且我无法找出一个函数(类似于 viewDidBecomeFocus,如果存在这样的函数)让它知道要查看。我觉得一定有办法做到这一点。

如果您知道在 ios 但不知道在 OSX 中执行此操作的方法,它仍然很有用。 谢谢!

【问题讨论】:

这里有一个很好的代表教程:link 【参考方案1】:

假设在您的第一个 ViewController 中有一个标签和一个按钮。按下时,该按钮打开弹出窗口(SecondViewController),带有一个文本字段(以及一个按钮表示准备好或关闭等),您希望在其中获取其值并将其分配给您的标签。这就是委托和协议派上用场的地方。

第二视图控制器:

@objc protocol TextDelegate 
    func passedString(textValue: String)


class SecondViewController: NSViewController 

    @IBOutlet weak var textField: NSTextField!

    weak var delegate: TextDelegate?

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do view setup here.
    

    @IBAction func closePopOver(sender: AnyObject) 
        if delegate != nil 
            delegate!.passedString(textField.stringValue)
        
        self.dismissViewController(self)
    

这是视图控制器:

@IBOutlet weak var myLabel: NSTextField!

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) 

    if segue.identifier == "mySegue" 
        let vc = segue.destinationController as! SecondViewController
        vc.delegate = self
    


func passedString(textValue: String) 
    myLabel.stringValue = textValue

【讨论】:

以上是关于人工触发 Segue的主要内容,如果未能解决你的问题,请参考以下文章

未触发自定义 segue 的展开

触发时第一次模态segue慢

无论凭据是不是正确,都会触发 Segue

为啥 UITableViewRow 需要长按才能触发 segue?

为登录用户触发 Segue

Segue 未从自定义 tableView 单元格触发