2016-11-11 115 views
1

在我的应用程序中,我有一个“主”ViewController。在其viewDidAppear体应用程序启动,我检索UserDefaults boolean的值:如果用户没有登录,我提出模态另一个viewcontroller这样:从UIViewController调用UIViewController方法深深地嵌套在模态中

self.performSegue(withIdentifier:"loginView", sender:self) 

这种模态启动AuthViewController,包含的ViewController “容器视图”,AuthViewController的区域,其包括UIPageViewControllerAuthPageViewController)。

这最后一个有两个“页”:LoginViewControllerRegisterViewController

More than a thousand words

LoginViewController是用来登录用户:一旦用户登录我想在主ViewController调用一个函数(不管它做什么)。

所以,总结一下,我在LoginViewController,我想打电话给ViewController的方法。

虽然试图解决我发现了以下内容:

  • 我不能让一个参考presentingViewController因为LoginViewController没有直接从视图控制器打开。此外,AuthViewController没有与present(_:animated:completion:)推出,但与self.performSegue正如我以前说过;
  • 实例化一个ViewControllerLoginViewController和调用方法的作品,但它不是一个好主意;
  • NSNotification工程就像一个魅力;
  • 显然代表没有工作,或者我在这个应用程序的比赛中错过了他们的实现的一些东西;

你能帮我理解如何从我的LoginViewController中调用ViewController方法吗?代码示例非常受欢迎,但我很欣赏任何建议。

+2

委托,如果你初始化的将工作'ViewController'中的'LoginViewController',否则只是使用通知,如果你同时关闭多个函数,展开也可能工作 – Tj3n

回答

1

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

首先,你需要在LoginViewController创建委托这样

protocol LoginViewControllerDelegate: class { 
    func goToContent(animated:Bool) 
} 

那么对于这样的

委托创建一个变量
weak var delegate: LoginViewControllerDelegate? 

现在在你ViewController你必须在你的准备prepareforsegue中指定这样的delegate方法,因为你正在使用赛格瑞这样

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") 
} 
这样

你可以叫goToContentLoginViewController

+0

好的,有趣的,谢谢!与此同时,我发现另一种方式,不那么优雅,以实现相同的结果:在prepareForSegue中,我在目标视图控制器上设置一个属性,并将其传递给自己。当我从LoginViewController需要它时,我通过父链的“链”来达到它。我不喜欢它,但它工作。 :-) –

+0

是的,你也可以这样做,但试试这个解决方案一次 – Rajat

+1

等一下,Rajat:ViewController实际上并没有为LoginViewController准备一个segue,而是为它的“granpa”AuthViewController –