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

Mic*_*ola 10 xcode ios swift

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

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

怎么能迅速完成?

Pik*_*urd 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在模态中:

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

当然,当你表现出ModalViewController需要设置callbackAction这样modal.callbackAction = modalAction()ViewController


Dav*_*e G 6

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

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

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

您可能希望使用模式上的展开segue来执行此操作,这样您就可以在展开时调用父函数.stackoverflow.com/questions/12561735/... - porglezomp于2014年12月15日3:41

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

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

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

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

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

添加操作方法后,您可以通过控制拖动到"退出"图标来定义故事板中的展开segue.

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