2014-09-25 12 views
15

Ho provato a eliminare il file storyboard e la relativa voce Info.plist ma questa estensione di tempo ha smesso di funzionare; non viene nemmeno lanciato da XCode.Come creare un widget Oggi a livello di codice senza storyboard su iOS8?

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

E 'facile su App regolare (contenente app) così come lo vediamo è punto di ingresso e delegato applicazione, ma come farlo sulle estensioni troppo?

risposta

19

Rimuovere NSExtensionMainStoryboard da Info.plist Aggiungi NSExtensionPrincipalClass = YourViewController

Non dimenticare di creare il proprio punto di vista in loadView

+2

Nota: questo deve essere nel dizionario NSExtension nel file info.plist per l'estensione. – xtravar

+0

ha dovuto fare questo per farlo funzionare: http://stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-boardboard –

31

ho fatto le seguenti operazioni:

  • eliminare il file storyboard dal progetto
  • Modificare info.plist:

Accedere al dizionario NSExtension, rimuovere questa chiave: NSExtensionMainStoryboard. Sostituiscilo con questa chiave NSExtensionPrincipalClass e aggiungi il tuo ViewController come valore, ad es. TodayViewController.

prima:

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

dopo:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionPrincipalClass</key> 
    <string>TodayViewController</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.widget-extension</string> 
</dict> 
  • Se stai usando Swift, è necessario attivare "contenuto incorporato contiene il codice Swift" nelle impostazioni di generazione del bersaglio. Impostalo su SÌ.
  • Inoltre ho dovuto aggiungere @objc (TodayViewController) nella classe TodayViewController (dopo le importazioni).

L'app dovrebbe essere eseguita ora. Ma c'erano altre due cose che dovevo fare:

  • Creare una vista. Ovviamente non c'è nessuna vista creata automaticamente.

Quindi aggiungere queste righe:

override func loadView() 
{ 
    view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0)) 
} 
  • e impostare l'altezza del tuo widget nel metodo viewDidLoad: self.preferredContentSize = CGSizeMake(0, 200)
+0

ha dovuto fare questo per farlo funzionare: http : //stackoverflow.com/questions/24416003/writing-an-ios-8-share-extension-without-boardboard –

+0

Posso chiedere perché dobbiamo creare una vista nella classe TodayViewController? Il controller di visualizzazione non contiene già una vista? – user6539552

+0

@Raphael, bella risposta. Volevo seguire una logica simile per un'estensione iMessage, ma non ero in grado di farlo. : -/ – Shyam

3

FWIW, non ha funzionato per me fino a quando ho aggiunto un prefisso del nome del modulo per la mia classe di controller di visualizzazione Swift, ad es

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

Ciò è probabilmente dovuto al fatto che la ricerca di classe per i moduli Swift trasforma i nomi dei moduli in prefisso per il nome della classe. Per esempio. per creare la tua classe nel codice scriverai NSStringFromClass("SafariActionExtension.RootViewController"), quindi il prefisso.

+1

Non riuscivo a farlo funzionare con il prefisso, quindi ho appena usato @obj (RootViewController) per specificare il nome della classe e funziona – Tapani

+0

Questa risposta ha risolto il mio problema! :-) Dovrebbe essere contrassegnato come risposta corretta ! – Alexey

Problemi correlati