从 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】:看着instantiateViewControllerWithIdentifier
documentation...
讨论你使用这个方法来创建视图控制器对象 你想在你的 应用。在您可以使用此方法检索视图之前 控制器,您必须使用适当的标识符显式标记它 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 设置徽章(无论何时推送通知)?