从 appdelegate 设置 UIViewController 委托

Posted

技术标签:

【中文标题】从 appdelegate 设置 UIViewController 委托【英文标题】:set UIViewController delegate from appdelegate 【发布时间】:2014-03-06 17:25:02 【问题描述】:

我正在尝试从我的应用委托中设置视图控制器的委托。 但它不起作用。

AppDelegate.m:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                              bundle:nil];

SFLoginViewController * LoginVC = (SFLoginViewController *)[sb
                                    instantiateViewControllerWithIdentifier:@"Login"];
LoginVC.delegate = self;

SFLoginViewController.m

- (IBAction)Login:(id)sender 

  NSLog(@"%@",self.delegate); //returns nil (!!)

  //It should call the delegate method here
  [[self delegate] LoginSucceeded];


有什么帮助吗?

【问题讨论】:

添加 self 作为代理后,是否将 LoginVC 添加到 AppDelegate 中的视图层次结构? SFLoginVC.m 中哪里调用 NSLog? @Greg 视图层次结构是什么意思?我在 UIbutton 触摸事件中调用它(触发登录过程).. 如果您发布更多相关代码可能会 我认为,NSLog 语句是在 loginVC.delegate = self; 之前执行的。声明,因此 - SFLoginViewController 对象被创建并触发 NSLog 消息,在您设置委托之前。 SFLoginViewController 中的 NSlog 语句在哪里? @JohnWoods 我已经更新了代码.. 【参考方案1】:

为什么不在 ViewController 中像这样设置你的委托:

self.delegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];

然后你就可以在你的 AppDelegate 中处理委托事件了。

【讨论】:

【参考方案2】:

看着instantiateViewControllerWithIdentifierdocumentation...

讨论你使用这个方法来创建视图控制器对象 你想在你的 应用。在您可以使用此方法检索视图之前 控制器,您必须使用适当的标识符显式标记它 Interface Builder 中的字符串。

此方法创建指定视图控制器的新实例 每次调用它。

我认为您的 appDelegate 中的代码不会返回通过情节提要呈现的 ViewController

【讨论】:

谢谢!我期待着这样的事情。我将使用@hw731 解决方案。【参考方案3】:

这样做

(SFLoginViewController *)[sb instantiateViewControllerWithIdentifier:@"Login"];

您正在创建一个新的 SFLoginViewController 实例。

我假设您已经有一个从情节提要创建的视图控制器的实例。 故事板中的实例是调用其方法 login:(id)sender 的实例,而不是您分配委托的实例。

尝试@hw731 答案,否则您需要将委托添加到从情节提要创建的实例(而不是您在 appdelegate 中创建的实例)。

【讨论】:

以上是关于从 appdelegate 设置 UIViewController 委托的主要内容,如果未能解决你的问题,请参考以下文章

无法从 appdelegate.m 为 NSProgressIndicator 设置动画

从 Appdelegate 设置 iBeacon 操作和监控

如果 UITabbarcontroller 不是 rootviewcontroller,如何从 Appdelegate 为 UIBarButtonItem 设置徽章(无论何时推送通知)?

如何在我的 AppDelegate 上设置多个本地通知?

在 AppDelegate.m 上设置 label.text

从 appdelegate 在 vi​​ewcontroller 中设置 BOOL