29

有没有人知道在没有MainInterface.storyboard模板附带的情况下编写 iOS 8 共享扩展的好方法?

当我删除文件或删除NSExtensionMainStoryboardfromInfo.plist时,扩展程序停止工作(当您点击共享窗格中的按钮时没有任何反应)。我们尝试替换NSExtensionMainStoryboardwhichNSExtensionPrincipalClass也不起作用。

有任何想法吗?

4

4 回答 4

62

弄清楚了!

原来在 Swift 中有一个奇怪的模块命名事情,所以你可以通过@objc给类添加一个名字来修复它:

@objc(PrincipalClassName)

class PrincipalClassName: UIViewController {
...

然后将NSExtensionPrincipalClass密钥设置为PrincipalClassName

于 2014-06-25T18:55:15.930 回答
21

而不是@objchack,在 Swift 中执行此操作的正确方法是将模块名称包含在 中NSExtensionPrincipalClass,即

<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ActionViewController</string>

(否则记录错误:

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

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

于 2019-08-22T03:07:06.570 回答
14

从这些答案中找到答案,结合了Answer 1Answer 2

对于 Objective-C,您必须在info.plistApp 扩展中添加以下内容: NSExtensionPrincipalClass并确保它在NSExtensionDict下

所以完整的答案应该是这样的,在我的例子ActionViewController中是 App extension viewController

在此处输入图像描述

于 2015-12-18T11:52:49.613 回答
4

无法添加评论,但它不再是NSPrincipalClass而是NSExtensionPrincipalClass

于 2015-02-16T20:32:26.100 回答