How to create a Today widget programmatically without storyboard on iOS8?

本小妞迷上赌 提交于 2019-12-03 05:59:18

问题


I tried to delete the storyboard file and related Info.plist entry but this time extension stopped working; it doesn't even launch from XCode.

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

It is easy on the regular app (containing app) as we see it's entry point and application delegate, but how to do it on extensions too?


回答1:


I did the following steps:

  • Delete the storyboard file from your project
  • Modify the info.plist:

Go to the NSExtension Dictionary, remove this key: NSExtensionMainStoryboard. Replace it with this key NSExtensionPrincipalClass and add your ViewController as the value, e.g. TodayViewController.

before:

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

after:

<key>NSExtension</key>
<dict>
    <key>NSExtensionPrincipalClass</key>
    <string>TodayViewController</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.widget-extension</string>
</dict>
  • If you're using Swift, you have to enable "Embedded Content Contains Swift Code" in the Build Settings of the target. Set it to YES.
  • Additionally I had to add @objc (TodayViewController) in my TodayViewController class (after the imports).

The app should run now. But there were two other things I had to do:

  • Create a view. Obviously there is no view created automatically.

So add these lines:

override func loadView()
{
    view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0))
}
  • And set the height of your widget in your viewDidLoad method: self.preferredContentSize = CGSizeMake(0, 200)



回答2:


Remove NSExtensionMainStoryboard from Info.plist Add NSExtensionPrincipalClass = YourViewController

Don't forget to create your own view in loadView




回答3:


FWIW, it didn't work for me until I added a prefix of the module name for my Swift view controller class, e.g.

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

That is probably because class lookup for Swift modules turns module names into prefix for class name. E.g. to create your class in code you would write NSStringFromClass("SafariActionExtension.RootViewController"), hence the prefix.



来源:https://stackoverflow.com/questions/26037321/how-to-create-a-today-widget-programmatically-without-storyboard-on-ios8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!