为什么让viewController解雇自己是不好的做法?

Ahm*_*mad 12 uiviewcontroller ios swift

我有两个视图控制器,MainVCModalVC.

当用户点击按钮时MainVC,会出现模态视图控制器.

然后,用户可以点击另一个按钮来关闭它并返回到主按钮.

我尝试了这两种方法,它们都完成了同样的事情:它们解雇了模态视图控制器:

//method 1:
//  File: ModalVC.swift
//
@IBAction func dismissTapped() {
     self.dismissViewControllerAnimated(false, completion: nil);
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,这很好用,但考虑另一种方法:使用委托让主控制器解雇:

// method 2: part A 
// File: ModalVC.swift
// 
protocol ModalVCDelegate {
    func modalVCDismissTapped();
}
...
...
...
var delegat:ModalVCDelegate? = nil;
...
...
@IBAction func dismissTapped() {
    delegate.modalVCDismissTapped();
}
Run Code Online (Sandbox Code Playgroud)

并在主视图控制器上自定义类文件:

// method 2: part B
// File: MainVC.swift

class MainVC : UIViewController, ModalVCDelegate {
...
...
    func modalVCDismissTapped() {
        self.dismissViewControllerAnimated(false, completion: nil);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这两种方法是必要的,我应该担心任何可能的内存泄漏吗?

任何解释都会有帮助

Mod*_*her 16

使用委托是解除视图控制器的最佳和更灵活的方法.
它的目的是在你的代码的某些未来或其他地方你可以重用这个VC,但由于某些原因,你可能不会将它呈现为模态,而是推入导航堆栈.所以你ModalVC不知道它是如何呈现的,但代表确实如此.
在这种情况下,您的代码中可以有2个位置

  1. 你提出模态和委托调用

    [self dismiss...]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您将其推入导航堆栈并委派调用

    [self.navigationController popView...]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您将其添加为子VC并委派调用

    [someParentVC removeChild..] 
    
    Run Code Online (Sandbox Code Playgroud)

    或任何其他适当的工作流程来删除它.