【问题标题】:Writing an iOS 8 share extension without a storyboard编写没有故事板的 iOS 8 共享扩展
【发布时间】:2014-08-16 10:47:03
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: ios iphone swift ios8 ios-app-extension


    【解决方案1】:

    想通了!

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

    @objc(PrincipalClassName)
    
    class PrincipalClassName: UIViewController {
    ...
    

    然后将NSExtensionPrincipalClass 键设置为PrincipalClassName

    【讨论】:

    • 嘿!谢谢,你能指定你在哪里找到这个的来源吗?
    • 使用 Swift 时,您需要在 Info.plist 的 NSExtensionPrincipalClass 键的值字段中指定“NotificationContent.NotificationContentViewController”。在这里,NotificationContent 是模块名称,NotificationContentViewController 是唯一的视图控制器类。
    【解决方案2】:

    在 Swift 中正确的做法是在 NSExtensionPrincipalClass 中包含模块名称,而不是 @objc hack,即,

    <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: ...)'
    

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

    【讨论】:

    • 我同意这是一个比@objc 指令更好的解决方案,也更清晰。为我工作?
    • 荣耀归于你!一直在寻找我的代码崩溃的原因,并且我自己也无法解决这个问题???
    【解决方案3】:

    从结合Answer 1Answer 2 的这些答案中找到答案。

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

    所以完整的答案应该是这样的,在我的情况下ActionViewController 是应用扩展视图控制器

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多