当模态视图控制器被解除时如何调用函数

Posted

技术标签:

【中文标题】当模态视图控制器被解除时如何调用函数【英文标题】:How to call a function when a Modal View Controller has been dismissed 【发布时间】:2018-11-30 02:39:33 【问题描述】:

我目前有一个用于登录的模式视图控制器。登录完成后,模式将关闭。一旦模式被解除,我无法让函数在原始视图控制器上运行。

我通过连接到主视图控制器上的按钮的 segue 调用模式。我要运行的函数已经在 viewDidLoad 和 viewWillAppear 中,当视图控制器最初加载并出现时它可以工作。

我正试图弄清楚如何让它再次运行函数,一旦返回到视图日期,模式被解除。

原始视图控制器:

class SignInView: UIViewController 

override func viewDidLoad() 
    super.viewDidLoad()

    navigationItem.hidesBackButton = true



override func viewWillAppear(_ animated: Bool) 

    checkUser()


模态视图控制器:

@IBAction func submitBtn(_ sender: Any) 

    if username.text == "" && password.text == "" 
        displayAlert("Error", message: "Please Enter an Username and Password")
    

    if username.text == "" 
        displayAlert("Error", message: "Please Enter an Username")
    

    if password.text == "" 
        displayAlert("Error", message: "Please Enter a Password")
    

    self.emailLogin()



func emailLogin() 

    guard let username = username.text, let password = password.text else 
        return
    

    Auth.auth().signIn(withEmail: username, password: password)  (user, error) in

        if error != nil 
            print("Login Error")
            self.displayAlert("Failed to Login", message: "Username or Password is Inccrrect")
            return
         else 

        print("Successfully Signed In")

        self.dismiss(animated: true, completion: nil)

        

    


【问题讨论】:

【参考方案1】:

一种可能性:改变

self.dismiss(animated: true, completion: nil)

self.dismiss(animated: true) 
    theSignInView.callTheMethod()

协议/委托模式通常用于促进这种方法。

【讨论】:

我得到错误'Instance member 'checkUser' cannot be used on type 'SignInView';您的意思是改用这种类型的值吗?【参考方案2】:

viewDidLoad 在首次启动 vc 时调用一次,viewWillappear,viewDidAppear 在您关闭模型时调用,例如使用导航控制器中的overCurrentContext / pop

如果上述情况不是您的情况,那么您需要在prepareForSegue 内有一个代表

let des = segue.destination as! ModalVC
des.delegate = self

class ModelVC://
  weak var delegate:MainVC?

然后在dismiss之前使用

delegate?.checkUser()
self.dismiss(animated: true, completion: nil)

另外,当您使用viewWillAppear 时,不要忘记super.viewWillAppear(animated)

override func viewWillAppear(_ animated: Bool) 
   super.viewWillAppear(animated)
   checkUser() 

【讨论】:

将此属性添加到它weak var delegate:MainVC?

以上是关于当模态视图控制器被解除时如何调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在模态视图被解除后,父视图控制器中是不是有一个委托被调用?

UIViewController 在解除先前呈现的模态视图控制器后被释放

如何在解除第二个控制器后调用第一个控制器中的函数

关闭模式视图但保留数据

关闭模式视图控制器偶尔冻结应用程序,swift 3

在自定义模式解除转换后,第一个视图控制器的生命周期方法不会被调用