【问题标题】:Referencing AppDelegate Methods - iphone引用 AppDelegate 方法 - iphone
【发布时间】:2012-08-20 16:25:27
【问题描述】:

我有一个 AppDelegate,它有 3 个视图。我把三个都加了

[window addSubview:gameViewController.view];
[window addSubview:viewSettings.view];
[window addSubview:viewController.view];
[window makeKeyAndVisible];

在应用程序委托中,我有一些方法可以通过调用来交换视图

[window bringSubviewToFront:gameViewController.view]; 

当我在 viewController 中时,我使用

pinkAppDelegate *appDelegate=  (pinkAppDelegate *)[[UIApplication sharedApplication] delegate];

[appDelegate switchToSettings];

切换我的子视图...到目前为止一切顺利。

但是,当我在 viewSetting UIViewController 中执行相同的 appDelegate 调用时,它会卡住,就像它不知道如何调用 appDelegate 方法一样。

我的所有视图都挂在我的主窗口 xib 中,但不知道为什么我不能遍历主 appdelegate 中的方法

【问题讨论】:

  • 你觉得[[UIApplication sharedApplication] delegate]; 失败了吗?或者您不能向它发送switchToSettings 消息?这是运行时还是编译时?
  • 运行时间...我无法发送消息。我可以从一个角度..但不能从另一个角度......

标签: iphone xcode


【解决方案1】:

在 viewController 内部,您正在设置一个名为 appDelegate 的局部变量,该变量指向您的应用委托。这就是这条线的作用:

pinkAppDelegate *appDelegate= (pinkAppDelegate *)[[UIApplication sharedApplication] delegate];

这个变量是 viewController 的本地变量,所以你不能在设置视图控制器中使用它。您需要在那里设置另一个变量。

或者,在整个应用程序中使用这个漂亮的#define。 (您需要将其放入项目中每个文件中包含的 .h 头文件中。)

#define myAppDelegate (MyAppDelegate *)[[UIApplication sharedApplication] delegate]

然后你可以在任何地方执行以下操作:

[myAppDelegate doSomething];

【讨论】:

  • 为什么不直接调用呢?:[[[UIApplication sharedApplicaion delegate] doSomething]
  • 除了 UIApplication 不会有那些自定义方法的事实......
  • @stefanB [[UIApplication delegate shared blah blah 很丑,这个解决方案有助于避免像 jalo 那样的错误。
  • 什么自定义方法?我只是建议使用#define 来使应用程序委托调用更漂亮并最大限度地减少输入错误。
  • #define 版本似乎不适合我。我收到警告“UIApplication 可能无法响应 +sharedApplication”类型的错误,并且在启动后无法正常工作......有什么建议吗?谢谢
【解决方案2】:

作为参考,上面仍然有一个错字,我还有另一个补充,这有助于避免每次都必须投射的警告。如果你使用:

#import "MyAppDelegate.h"
#define myAppDelegate (MyAppDelegate *) [[UIApplication sharedApplication] delegate]

我把上面的放在一个constants.h中然后就可以使用了

[myAppDelegate doSomething];

我在任何地方导入常量.h

【讨论】:

    【解决方案3】:

    简的回答有错别字。

    在您在每个类中导入的头文件(例如,defines.h)中使用以下行:

    #define myAppDelegate [[UIApplication sharedApplication] delegate]
    

    您也可以在前缀头文件中使用该行 - 这是一种在任何地方都可以访问它的简单方法。

    那么在任何方法中,您都可以使用以下任何一种:

    [myAppDelegate doSomething]; 
     myAppDelegate.property=value;
     myAppDelegate.childClassOfMyAppDelegate.property=value;
    [myAppDelegate.ChildOfMyAppDelegate doSomething]; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2014-06-20
      相关资源
      最近更新 更多