2014-09-25 14 views
15

Próbowałem usunąć plik scenorysu i powiązany wpis Info.plist, ale to rozszerzenie czasu przestało działać; nie uruchamia się nawet z XCode.Jak programowo utworzyć widget Today bez storyboardu na iOS8?

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

Łatwo jest na regularnej aplikacji (zawierający APP), jak widzimy to punkt wejścia i delegata aplikacji, ale jak to zrobić na rozszerzeniach za to?

Odpowiedz

19

Usuń NSExtensionMainStoryboard z Info.plist Dodaj NSExtensionPrincipalClass = YourViewController

Nie zapomnij stworzyć swój własny pogląd na loadView

+2

Uwaga: To musi być w słowniku NSExtension w info.plist dla rozszerzenia. – xtravar

+0

musiał to zrobić, aby działało: http://stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-a-storyboard –

31

Zrobiłem następujące kroki:

  • usunąć plik storyboard z projektu
  • Modyfikuj info.plist:

Przejdź do słownika NSExtension, usuń ten klucz: NSExtensionMainStoryboard. Zastąp go tym kluczem NSExtensionPrincipalClass i dodaj swój ViewController jako wartość, np. TodayViewController.

przed:

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

po:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionPrincipalClass</key> 
    <string>TodayViewController</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.widget-extension</string> 
</dict> 
  • Jeśli używasz Swift, trzeba włączyć "osadzonej zawartości Zawiera kod SWIFT" w ustawieniach kompilacji celu. Ustaw na TAK.
  • Dodatkowo musiałem dodać @objc (TodayViewController) w mojej klasie TodayViewController (po imporcie).

Aplikacja powinna teraz działać. Ale musiałem jeszcze zrobić dwie inne rzeczy:

  • Utwórz widok. Oczywiście nie ma automatycznie utworzonego widoku.

więc dodać te linie:

override func loadView() 
{ 
    view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0)) 
} 
  • i ustawić wysokość widżetu w swojej metodzie viewDidLoad: self.preferredContentSize = CGSizeMake(0, 200)
+0

musiał to zrobić, aby działało: http : //stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-a-storyboard –

+0

Czy mogę zapytać, dlaczego musimy utworzyć widok w klasie TodayViewController? Czy kontroler widoku już nie zawiera widoku? – user6539552

+0

@Raphael, dobra odpowiedź. Chciałem zastosować podobną logikę dla rozszerzenia iMessage, ale nie udało mi się. : -/ – Shyam

3

FWIW, to nie dla mnie, dopóki nie dodano przedrostek nazwy modułu dla mojej klasy kontrolera widoku Swift, np

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

Jest tak prawdopodobnie dlatego, że wyszukiwanie klas dla modułów Swift zamienia nazwy modułów na prefiks dla nazwy klasy. Na przykład. Aby utworzyć klasę w kodzie, należy napisać NSStringFromClass("SafariActionExtension.RootViewController"), stąd przedrostek.

+1

Nie mogłem uzyskać tego działającego z prefiksem, więc użyłem właśnie @obj (RootViewController) do określenia nazwy klasy i działa. – Tapani

+0

Ta odpowiedź rozwiązała mój problem! :-) Powinno być oznaczone jako prawidłowa odpowiedź ! – Alexey

Powiązane problemy