我正在编写一个应用程序,它也有一个 Today 扩展(或小部件)。Apple 推荐的在扩展程序和包含应用程序之间共享代码的方法是将共享代码放在应用程序和扩展程序都可以使用的嵌入式框架中。所以据我了解,我应该编写共享代码并使共享代码以框架为目标,然后让应用程序和扩展都将框架声明为依赖项。然而,在实践中,我发现虽然应用程序可以很好地识别框架,但 Today 扩展程序却不能。
更具体地说:我将一个简单的表格视图放在我的 Today 扩展(我称之为“Widget”)和我的应用程序中的一个选项卡(我称之为“App”)中的控制器中,然后一个带有共享代码的框架(我称之为“框架”)。Widget 带有一个 TodayViewController,其中包含表格视图。这个表视图有一个自定义单元格,我称之为 CalendarCell。所以相关的共享类/文件是:
- TodayViewController.h/m
- 日历单元格.xib
- CalendarCell.h/m
然后,当然,我有我的 Widget 故事板和 App 故事板,它们不共享。
因此,在我的 App 目标构建阶段,我将 Framework 作为目标依赖项,并将 Widget 作为目标依赖项(当我创建目标时它就是这样,删除它似乎没有任何帮助)。同样,在 Widget 目标构建阶段,我将 Framework 作为目标依赖项。框架将 TodayViewController.m 和 CalendarCell.m 列为编译源,CalendarCell.xib 作为捆绑资源。
所以这就是问题所在:如果 Widget 没有将CalendarCell.m、TodayViewController.m 和 CalendarCell.xib 列为编译源和捆绑资源,那么该小部件就无法工作。具体来说,如果 TodayViewController.m 未列出,则应用程序甚至无法在模拟器中运行(我得到与此人相同的错误)。如果 TodayViewController.m 已列出,但没有列出任何其他源文件/资源,那么我会得到一个没有正文的扩展名(与其他人得到的相同)。请注意,App 确实可以很好地识别框架,并且不必将这些文件列为编译源或捆绑资源 - 它只是 Widget 失败了。
如果有人对此有想法,我将不胜感激。Xcode 6 / iOS 8 错误?还是我做错了什么?