2016-03-11 23 views
6

Ho perso una mezza giornata per capire questo e non riesco a vedere una soluzione diretta online.Dove inserire il file .xib all'interno del progetto quadro?

Ho creato un framework CocoaTouch iOS. Ho alcune lezioni private e pubbliche e tutto funziona bene. Il problema è quando ho Aggiungi file .xib all'interno di tale quadro.

Dentro il mio quadro che voglio creare un'istanza di file .xib e l'errore sto ottenendo è:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/dino/Library/Developer/CoreSimulator/Devices/FEDECDC2-D4EA-441E-B53B-329A5B3DFB7A/data/Containers/Bundle/Application/78CEC01F-4C36-4143-A7D6-DDE6CCAC801B/MyApp.app> (loaded)' with name 'NUInAppMessageView'' 

Ho sentito dire che i file .xib non possono essere contenuti all'interno libreria statica, ma penso che dovrebbe essere in grado di essere utilizzato all'interno del framework.

La destinazione del mio framework contiene "Copy Bundle Resources" di prima e questo file .xib è stato aggiunto automaticamente quando l'ho creato all'interno del progetto framework.

enter image description here

ho letto su alcuni luoghi che le risorse dovrebbero essere aggiunti in un separato. bundle target ma non esiste un'opzione "bundle" quando si creano nuovi target e credo che questo sia il vecchio statico-libreria-giorni.

Questo è il codice che sto usando per inizializzare mio punto di vista (all'interno del quadro):

NSBundle * frameworkBundle = [NSBundle bundleForClass:[self class]]; // fine (not nil) 

NUInAppMessageView *view = [[frameworkBundle loadNibNamed:@"NUInAppMessageView" owner:self options:nil] firstObject]; // <-- CRASH 

ho cercato di rompere questo in un più chiamate di metodo e calcolato che Pennino si è sempre creato:

UINib *nib = [UINib nibWithNibName:@"NUInAppMessageView" 
           bundle:frameworkBundle]; // fine (not nil) 
NSArray *objects = [nib instantiateWithOwner:self options:nil]; // <-- CRASH 

Non ho più idee. Ho provato con il progetto Clean, cancellando i dati derivati ​​ma non sembrano fare il lavoro.

Mi manca qualcosa qui?

+0

Non ho idea di cosa stai facendo male, quindi ho creato un progetto di esempio che puoi scaricare ed esaminare. È scritto in Swift ma ciò non dovrebbe fare molta differenza, esp. come c'è pochissimo codice. :) https://github.com/mattneub/FrameworkWithNib – matt

+0

L'unica differenza evidente tra il tuo codice e il mio è che ho caricato quel pennino dal codice principale, non dal codice quadro, ma quello era solo un incidente; non fa differenza. L'ho appena riscritto in modo tale da caricare il pennino all'interno del codice framework e funziona anche bene. – matt

+0

@matt Ho intenzione di eliminare tutto e creare file .xib freschi. Potrebbe essere che Xcode abbia incasinato qualche parte con le impostazioni memorizzate nella cache. Grazie. – vale4674

risposta

5

Dove inserire i file di pennini in un framework nel progetto iOS?

sfondo alla mia risposta:
stavo cercando di esportare un po 'di attuazione relative UITableView e aveva UITableViewCell.xib file compressi con esso. E si trasformano in file .nib alla fine! ;-) E mi riferivo a quei file Pennino come segue:

[[NSBundle mainBundle] loadNibNamed:customCellID owner:nil options:nil]; 

Spiegazione:
Ma qui la cosa che ho fatto di male a dire, ho costruire un Cocoa Touch quadro statico e tenta di utilizzarlo all'interno un'altra applicazione. Quindi, in fase di esecuzione, quale sarebbe il MainBundle? Sicuramente la mia implementazione di UITableView sta cercando di scoprire quel file Nib per CustomCellID all'interno del bundle principale dell'App.

Risposta:
Così ho alterato frammento di codice di cui sopra la mia UITableView di applicazione come segue:

NSString *frameworkBundleId = @"com.randika.MyFrameworkBundleIDHere"; 
    NSBundle *resourcesBundle = [NSBundle bundleWithIdentifier:frameworkBundleId]; 

    customCell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:customCellID]; 
    if (customCell == nil) { 
     NSArray *nibs = [resourcesBundle loadNibNamed:emptyCellID owner:nil options:nil]; 
     customCell = [nibs objectAtIndex:0]; 
    } 

E il quadro che ho costruito fuori dalla mia UITableView esecuzione non ha dato mai più l'errore di cui sopra! :-)

Spero che questa risposta possa essere utile a qualcuno là fuori!

Cheers! :-)

+0

grazie, ha funzionato per noi – meronix

+2

Da dove hai preso il frameworkBundleId? – gangelo

Problemi correlati