2014-09-25 5 views
15

Ich habe versucht, die Storyboard-Datei und den zugehörigen Eintrag Info.plist zu löschen, aber dieses Mal funktioniert die Erweiterung nicht mehr; Es startet nicht einmal von XCode.Wie erstellt man ein Widget heute programmatisch ohne Storyboard auf iOS8?

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

Es ist einfach, auf die reguläre App (die app), wie wir sehen, es ist Einspeisepunkt und Anwendung delegieren, aber wie es auf Erweiterungen zu tun?

Antwort

19

entfernen NSExtensionMainStoryboard von Info.plist hinzufügen NSExtensionPrincipalClass = YourViewController

Vergessen Sie nicht Ihre eigene Meinung in loadView

+2

Hinweis: Dies muss unter dem NSExtension-Wörterbuch in der Datei info.plist für die Erweiterung stehen. – xtravar

+0

musste dies tun, damit es funktioniert: http://stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-a-storyboard –

31

erstellen Ich habe die folgenden Schritte:

  • die Storyboard-Datei aus dem Projekt löschen
  • Ändern Sie die info.plist:

Gehen Sie zum NSExtension Dictionary, entfernen Sie diesen Schlüssel: NSExtensionMainStoryboard. Ersetzen Sie es durch diesen Schlüssel NSExtensionPrincipalClass und fügen Sie Ihren ViewController als Wert hinzu, z. HeuteViewController.

vor:

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

nach:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionPrincipalClass</key> 
    <string>TodayViewController</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.widget-extension</string> 
</dict> 
  • Wenn Sie Swift verwenden, müssen Sie "Embedded Inhalt Enthält Swift Code" in den Build-Einstellungen des Ziels ermöglichen. Setze es auf JA.
  • Zusätzlich musste ich @objc (TodayViewController) in meiner TodayViewController-Klasse hinzufügen (nach dem Import).

Die App sollte jetzt ausgeführt werden. Aber es gab zwei andere Dinge, die ich tun musste:

  • Erstellen Sie eine Ansicht. Offensichtlich wird keine Ansicht automatisch erstellt.

So fügen Sie diese Zeilen:

override func loadView() 
{ 
    view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0)) 
} 
  • Und stellen Sie die Höhe Ihres Widgets in Ihrer viewDidLoad Methode: self.preferredContentSize = CGSizeMake(0, 200)
+0

musste dies tun, damit es funktioniert: http : //stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-a-storyboard –

+0

Darf ich fragen, warum wir eine Ansicht in der TodayViewController-Klasse erstellen müssen? Enthält der View Controller nicht bereits eine Ansicht? – user6539552

+0

@Raphael, nette Antwort. Ich wollte eine ähnliche Logik für eine iMessage-Erweiterung verfolgen, war aber nicht in der Lage. : -/ – Shyam

3

FWIW, ist es nicht, bis ich für mich arbeiten ein Präfix des Modulnamens für meine Swift-View-Controller-Klasse hinzugefügt, z

Dies ist wahrscheinlich, weil Klassensuche für Swift-Module Modulnamen in Präfix für Klassennamen verwandelt. Z.B. Um Ihre Klasse in Code zu erstellen, würden Sie NSStringFromClass("SafariActionExtension.RootViewController") schreiben, daher das Präfix.

+1

Ich konnte es nicht mit dem Präfix arbeiten, so dass ich nur @obj (RootViewController) verwendet, um den Klassennamen anzugeben und es funktioniert. – Tapani

+0

Diese Antwort löste mein Problem! :-) Sollte als richtige Antwort markiert werden ! – Alexey

Verwandte Themen