如何在iOS8上以编程方式创建Today小部件而不使用storyboard?

时间:2014-09-25 11:20:34

标签: ios widget ios8 ios-app-extension

我尝试删除故事板文件和相关的Info.plist条目,但这次延期停止了工作;它甚至没有从XCode启动。

The operation couldn’t be completed. (LaunchServicesError error 0.)

在常规应用程序(包含应用程序)上很容易,因为我们看到它的入口点和应用程序委托,但是如何在扩展程序上执行此操作?

3 个答案:

答案 0 :(得分:36)

我做了以下步骤:

  • 从项目中删除情节提要文件
  • 修改info.plist:

转到NSExtension词典,删除此键:NSExtensionMainStoryboard。将其替换为此密钥NSExtensionPrincipalClass,并将您的ViewController添加为值,例如TodayViewController。

之前:

<key>NSExtension</key>
<dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.widget-extension</string>
</dict>

后:

<key>NSExtension</key>
<dict>
    <key>NSExtensionPrincipalClass</key>
    <string>TodayViewController</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.widget-extension</string>
</dict>
  • 如果你正在使用Swift,你必须启用&#34;嵌入式内容包含Swift Code&#34;在目标的构建设置中。将其设置为YES。
  • 此外,我必须在我的TodayViewController类中添加@objc (TodayViewController)(在导入之后)。

该应用应该立即运行。但我还有另外两件事要做:

  • 创建一个视图。显然没有自动创建视图。

所以添加这些行:

override func loadView()
{
    view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0))
}
  • 并在viewDidLoad方法中设置窗口小部件的高度:self.preferredContentSize = CGSizeMake(0, 200)

答案 1 :(得分:19)

NSExtensionMainStoryboard移除Info.plist 添加NSExtensionPrincipalClass = YourViewController

不要忘记在loadView

中创建自己的观点

答案 2 :(得分:5)

FWIW,在我为Swift视图控制器类添加了模块名称的前缀之前,它对我没有用,例如

<key>NSExtension</key>
<dict>
    <!-- ... -->
    <key>NSExtensionPrincipalClass</key>
    <string>SafariActionExtension.RootViewController</string>
    <!-- ... -->
</dict>

这可能是因为Swift模块的类查找将模块名称转换为类名的前缀。例如。要在代码中创建您的类,您可以编写NSStringFromClass("SafariActionExtension.RootViewController"),因此使用前缀。