Ios 从深度嵌套在模态中的UIViewController调用UIViewController方法
在我的应用程序中,我有一个“main”Ios 从深度嵌套在模态中的UIViewController调用UIViewController方法,ios,swift3,Ios,Swift3,在我的应用程序中,我有一个“main”ViewController。在应用程序启动时,在其视图的主体中出现,我检索用户默认值布尔值:如果用户未登录,我以以下方式显示另一个视图控制器: self.performSegue(withIdentifier:"loginView", sender:self) 这将以模态方式启动AuthViewController,一个包含“容器视图”的视图控制器,一个包含UIPageViewController(AuthPageViewController)的Auth
ViewController
。在应用程序启动时,在其视图的主体中出现
,我检索用户默认值布尔值
:如果用户未登录,我以以下方式显示另一个视图控制器
:
self.performSegue(withIdentifier:"loginView", sender:self)
这将以模态方式启动AuthViewController
,一个包含“容器视图”的视图控制器,一个包含UIPageViewController
(AuthPageViewController
)的AuthViewController区域
最后一个有两个“页面”:LoginViewController
和RegisterViewController
LoginViewController
用于登录用户:一旦用户登录,我想调用主ViewController
上的函数(无论它做什么)
总之,我在LoginViewController
中,我想调用ViewController
的一个方法
在尝试解决方案时,我发现了以下问题:
- 我无法获取对
的引用,因为没有直接从ViewController打开presentingViewController
。此外,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
中,您必须在prepareprepareforsegue
方法中像这样分配委托
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
中,您必须在prepareprepareforsegue
方法中像这样分配委托
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准备一个序列