WatchKit:'sharedApplication'不可用:iOS上不可用(App Extension) - 在适当的情况下使用基于视图控制器的解决方案

时间:2015-03-26 20:28:59

标签: ios watchkit

我在监视工具包扩展中的构建阶段添加了Manager.m(iOS类)。但是,我收到以下错误

  

'sharedApplication'不可用:iOS上不可用(应用程序   扩展) - 适当时使用基于视图控制器的解决方案   代替

以下是我的Manager.m中导致问题的行。

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

我想在Manager.m中使用代码,但是像这样的代码行会导致问题,并且不会让我运行监视App。有没有解决的办法?我不想重写整个班级只是为了容纳watchkit。

5 个答案:

答案 0 :(得分:5)

在监视工具包扩展程序的目标构建设置中定义/添加宏(例如WATCH_KIT_EXTENSION_TARGET),并使用它来有选择地构建代码。例如。由于sharedApplication在iOS扩展程序中不可用,因此您可以使用以下代码

#ifndef WATCH_KIT_EXTENSION_TARGET
AppDelegate *appDelegate =
  (AppDelegate *)[[UIApplication sharedApplication] delegate];
#endif

答案 1 :(得分:0)

扩展是一个不同的目标,因此他们需要访问源代码,包括编译所需的所有.m类。

这意味着如果你的类在主应用程序和扩展中都被使用,你应该重构它,这样扩展只能访问它需要的行为/逻辑而不是全部。您可以手动禁用编译代码块,但这会给您的代码IMO增加噪音,并使其他人更难理解。

我想说将它分成两个或三个类,以获得更清晰的代码。一个用于扩展,一个用于主应用程序,一个共享类(如果需要)。您可以使用不同的设计模式,并且在不了解您的应用程序的情况下,我不能特别推荐。

答案 2 :(得分:0)

为避免在应用扩展程序中使用[UIApplication sharedApplication]时出现编译时错误,您可以使用我的category

答案 3 :(得分:0)

如果您知道只能从iPhone应用程序调用特定功能,则另一个选项是将sharedApplication或其delegate作为参数传递给Manager上的方法。

- (void)doSomething:(UIApplication *)sharedApplication {
    [sharedApplication delegate];
}

然后调用者(来自某个没有Watch Extension目标成员资格的地方):

[[Manager sharedInstance] doSomething:[UIApplication sharedApplication]];

答案 4 :(得分:0)

[[UIApplication sharedApplication] delegate];在WatchKit中不可用,但现在可以访问访问共享委托对象的并行 - 请参阅What is the equivalent of UIApplication.sharedApplication().delegate in WatchKit?