Swift:解除模态后在ViewController上执行一个函数

时间:2014-12-15 03:33:32

标签: ios xcode swift

用户位于视图控制器中,该控制器调用模态。当在模态上调用self.dismissViewController时,需要在初始视图控制器上运行函数。此函数还需要从模态传递的变量。

此模式可以从多个视图控制器中显示,因此无法在模态视图的viewDidDisappear中直接调用该函数。

如何在swift中实现这一目标?

3 个答案:

答案 0 :(得分:6)

delegate怎么样?

或者你可以像这样ViewController

typealias Action = (x: AnyObject) -> () // replace AnyObject to what you need
class ViewController: UIViewController {
  func modalAction() -> Action {
    return { [unowned self] x in 
      // the x is what you want to passed by the modal viewcontroller
      // now you got it
    }
  }
}

以模态:

class ModalViewController: UIViewController {
  var callbackAction: Action?
   override func viewDidDisappear(_ animated: Bool) {
    let x = … // the x is what you pass to ViewController
    callbackAction?(x)
  }
}

当然,当您显示ModalViewController需要在callbackAction

中设置modal.callbackAction = modalAction()这样的ViewController

答案 1 :(得分:6)

提问者(Michael Voccola)提供和选择的答案对我没有用,所以我想提供另一个答案选项。他的回答对我没有用,因为当我解除模态视图时,viewDidAppear似乎没有运行。

我有一个表和一个模态VC出现并需要一些表输入。我发送初始VC模态的新变量信息没有问题。但是,在解除模态视图时,我无法让表自动运行tableView.reloadData函数。

对我有用的答案在上面的评论中:

  

您可能希望使用模态上的展开segue来执行此操作   你可以在它被调用的父项上设置一个函数   解开。 stackoverflow.com/questions/12561735 / ... - porglezomp 12月15日   ' 14在3:41

如果您只是展开一步(VC2到VC1),您只需要一个给定答案的片段:

第1步:在VC1代码中插入方法

  

执行展开segue时,需要指定一个动作   是要放松到的视图控制器的操作方法:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
    //Insert function to be run upon dismiss of VC2
}

第2步:在故事板中,在显示的VC2中,从按钮拖动到退出图标,然后选择" unwindToThisViewController"

  

添加操作方法后,您可以定义展开   通过控制拖动到“退出”图标来在故事板中进行segue。

就是这样。这两个步骤对我有用。现在当我的模态视图被解雇时,我的表格会更新。我只是想加上这个,以防其他人的问题没有被所选答案解决。

答案 2 :(得分:4)

通过将模态视图控制器中的全局变量设置为布尔值,我能够实现所需的结果。该变量是从一个单独的类中的结构启动并可用的。

当模态被解除时,初始视图控制器上的viewDidAppear方法会相应地响应全局变量的值,并在需要时翻转全局变量的值。

我不确定这是否是从性能角度来看最有效的方式,但它在我的场景中完美运行。