编写没有故事板的iOS 8共享扩展

编写没有故事板的iOS 8共享扩展,ios,iphone,swift,ios8,ios-app-extension,Ios,Iphone,Swift,Ios8,Ios App Extension,有没有人知道有没有一种好方法可以在不使用模板附带的mainterface.storyboard的情况下编写iOS 8共享扩展 当我删除文件或从Info.plist中删除NSExtensionMainStoryboard时,扩展将停止工作(点击共享窗格中的按钮时不会发生任何事情)。我们尝试将NSExtensionMainStoryboard替换为NSExtensionPrincipalClass,但同样无效 有什么想法吗?想出来了 事实证明,Swift中存在一个奇怪的模块命名问题,因此您可以通过向

有没有人知道有没有一种好方法可以在不使用模板附带的
mainterface.storyboard
的情况下编写iOS 8共享扩展

当我删除文件或从
Info.plist
中删除
NSExtensionMainStoryboard
时,扩展将停止工作(点击共享窗格中的按钮时不会发生任何事情)。我们尝试将
NSExtensionMainStoryboard
替换为
NSExtensionPrincipalClass
,但同样无效

有什么想法吗?

想出来了

事实证明,Swift中存在一个奇怪的模块命名问题,因此您可以通过向类添加
@objc
名称来修复它:

@objc(PrincipalClassName)

class PrincipalClassName: UIViewController {
...

然后将
NSExtensionPrincipalClass
键设置为
PrincipalClassName
无法添加注释,但它不再是NSPrincipalClass,而是NSExtensionPrincipalClass

从这些答案中找到了答案,并将其组合在一起

对于Objective-C,您必须在应用程序扩展的
info.plist
中添加以下内容:
NSExtensionPrincipalClass
并确保它位于
NSExtension
Dict下

所以完整的答案应该是这样的,在我的例子中,
ActionViewController
是应用程序扩展viewController


在Swift中,正确的方法是将模块名称包含在
NSExtensionPrincipalClass
中,而不是
@objc
黑客攻击,即

NSExtensionPrincipalClass
$(产品\模块\名称)。ActionViewController
(以其他方式记录错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: ...)'

希望将来能帮助遇到此错误的人。)

嘿!谢谢,您可以指定找到此文件的来源吗?使用Swift时,您需要在Info.plist的
NSExtensionPrincipalClass
键的值字段中指定'NotificationContent.NotificationContentViewController'。在这里,
NotificationContent
是模块名,
NotificationContentViewController
是唯一的视图控制器类。我同意这是一个比@objc指令更好的解决方案,也更清晰。为我工作,为你荣耀!我一直在寻找我的代码崩溃的原因,但我自己却无法找到原因