Ios 从深度嵌套在模态中的UIViewController调用UIViewController方法

Ios 从深度嵌套在模态中的UIViewController调用UIViewController方法,ios,swift3,Ios,Swift3,在我的应用程序中,我有一个“main”ViewController。在应用程序启动时,在其视图的主体中出现,我检索用户默认值布尔值:如果用户未登录,我以以下方式显示另一个视图控制器: self.performSegue(withIdentifier:"loginView", sender:self) 这将以模态方式启动AuthViewController,一个包含“容器视图”的视图控制器,一个包含UIPageViewController(AuthPageViewController)的Auth

在我的应用程序中,我有一个“main”
ViewController
。在应用程序启动时,在其
视图的主体中出现
,我检索
用户默认值布尔值
:如果用户未登录,我以以下方式显示另一个
视图控制器

self.performSegue(withIdentifier:"loginView", sender:self)
这将以模态方式启动
AuthViewController
,一个包含“容器视图”的视图控制器,一个包含
UIPageViewController
AuthPageViewController
)的AuthViewController区域

最后一个有两个“页面”:
LoginViewController
RegisterViewController

LoginViewController
用于登录用户:一旦用户登录,我想调用主
ViewController
上的函数(无论它做什么)

总之,我在
LoginViewController
中,我想调用
ViewController
的一个方法

在尝试解决方案时,我发现了以下问题:

  • 我无法获取对
    presentingViewController
    的引用,因为没有直接从ViewController打开
    LoginViewController
    。此外,
    AuthViewController
    不是在
    present(uquo:animated:completion:)
    的情况下启动的,而是如我前面所说的
    self.performsgue
  • LoginViewController
    实例化
    ViewController
    并调用方法是可行的,但这不是一个好主意
  • NSNotification
    就像一个符咒
  • 显然,代表们没有工作,或者我在这个应用程序的竞赛中遗漏了一些关于他们实现的东西

您能帮助我理解如何从我的LoginViewController调用ViewController方法吗?代码示例非常受欢迎,但我非常感谢您的建议。

让我用代码解释一下在这种情况下如何使用委托

首先,您需要在
LoginViewController
中创建一个委托,如下所示

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}
然后像这样为委托创建一个变量

weak var delegate: LoginViewControllerDelegate?
现在,在您的
ViewController
中,您必须在prepare
prepareforsegue
方法中像这样分配
委托

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}
然后像这样实现这个方法

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}

通过这种方式,您可以从
LoginViewController
调用
goToContent
,在这种情况下,让我用如何使用委托的代码解释一下

首先,您需要在
LoginViewController
中创建一个委托,如下所示

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}
然后像这样为委托创建一个变量

weak var delegate: LoginViewControllerDelegate?
现在,在您的
ViewController
中,您必须在prepare
prepareforsegue
方法中像这样分配
委托

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}
然后像这样实现这个方法

protocol LoginViewControllerDelegate: class {
    func goToContent(animated:Bool)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "yourSegueIdentifier" {
        let nextScene =  segue.destination as! LoginViewController
        nextScene.delegate = self
    }
}
func goToContent(animated: Bool) {
    print("test")
}

通过这种方式,您可以从
LoginViewController

调用
goToContent
,如果您从
ViewController
初始化
LoginViewController
,则委托将起作用,否则只需使用通知,如果您同时关闭多个,则展开也可以工作如果您从
ViewController
启动
LoginViewController
,则委托将工作,否则只需使用通知,如果您同时关闭多个,则展开也可以工作OK,有趣,谢谢!同时,我找到了另一种方式,不那么优雅,来实现相同的结果:在PrepareForsgue中,我在目标viewcontroller上设置了一个属性,并将其自身传递。当我从LoginViewController需要它时,我通过父级的“链”到达它。我不喜欢它,但它奏效了。:-)是的,你也可以这样做,但是试一下这个解决方案,Rajat:ViewController实际上并没有为LoginViewController准备一个segue,而是为它的“granpa”AuthViewControllerOk准备一个segue,很有趣,谢谢!同时,我找到了另一种方式,不那么优雅,来实现相同的结果:在PrepareForsgue中,我在目标viewcontroller上设置了一个属性,并将其自身传递。当我从LoginViewController需要它时,我通过父级的“链”到达它。我不喜欢它,但它奏效了。:-)是的,你也可以这样做,但是试一下这个解决方案,Rajat:ViewController实际上并没有为LoginViewController准备一个序列,而是为它的“granpa”AuthViewController准备一个序列