【问题标题】:set UIViewController delegate from appdelegate从 appdelegate 设置 UIViewController 委托
【发布时间】: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 我已经更新了代码..

标签: ios objective-c uistoryboard appdelegate


【解决方案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 中创建的实例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多