我在监视工具包扩展中的构建阶段添加了Manager.m(iOS类)。但是,我收到以下错误
'sharedApplication'不可用:iOS上不可用(应用程序 扩展) - 适当时使用基于视图控制器的解决方案 代替
以下是我的Manager.m中导致问题的行。
AppDelegate *appDelegate =
(AppDelegate *)[[UIApplication sharedApplication] delegate];
我想在Manager.m中使用代码,但是像这样的代码行会导致问题,并且不会让我运行监视App。有没有解决的办法?我不想重写整个班级只是为了容纳watchkit。
答案 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?