2014-11-28 27 views
8

Sto cercando di utilizzare IB Designable e IB Inspectable nel mio UIButton ma sembra che ci siano alcuni errori.Libreria statica, bundle e IB designabile

Nel Problema Navigator, il file di bundle:

Storyboard: IB Designables: Impossibile aggiornare lo stato di layout automatico: Impossibile caricare designabled dal percorso (null)

Così Mi chiedo se ci sono alcune configurazioni da fare per usarlo in una lib statica o qualcosa del genere?

Questo è

#import <UIKit/UIKit.h> 

IB_DESIGNABLE 

@interface CustomUIButton : UIButton 

@property (nonatomic) IBInspectable int cornerRadius; 

@end 

mio pulsante personalizzato voglio vivere il rendering è all'interno di un controller di vista

risposta

-2

EDIT: IB progettabile e IB ispezionabile non sembrano lavorare con le librerie statiche, quindi se si' Se si utilizza una libreria statica, considerare l'utilizzo di un framework dinamico (solo iOS 8) o spostare il componente all'esterno della libreria statica, se possibile.

Per problemi relativi con Cocoapods, utilizzare la seguente soluzione:

Questo è legato alla this question.

ecco la soluzione:

1) Installare Cocoapods (0.36.0.beta.1) o più recente;

2) Aggiungere use_frameworks! al Podfile

Tutte here.

+4

Non ha specificato che stava usando CocoaPods. Questo problema sembra influenzare IB_DESIGNABLES che risiede su una libreria statica e viene utilizzato su storyboard o xib di un altro progetto. The use_frameworks! la direttiva sembra dire a CocoaPods di importare framework invece di librerie statiche. –

3

Sfortunatamente non è possibile utilizzare IBDesignables con librerie statiche (o framework statici).

Questa non è una buona risposta, ma voglio dare qualche contesto sul perché.

Sembra che il modo in Interface Builder classi carichi possano essere visualizzate come designables è di caricare effettivamente dinamicamente la dinamica quadro che si crea (e non binario della tua app), e utilizzando le classi direttamente (dopo aver cambiato usando il Runtime Objective-C abbastanza un po ').

Si può vedere che Interface Builder non viene caricato la vostra applicazione, e solo i singoli quadri con questi passaggi:

  1. Creare un nuovo progetto Xcode
  2. creare un nuovo target quadro nel progetto
  3. Aggiungere una classe che è IBDesignable
  4. Nel storyboard dalla tua app creare una vista e impostare la sua classe per classe del framework IBDesignable
  5. Fare clic su "Aggiorna tutte le viste" nel menu "Editor"
  6. Nella cartella DerivedData del progetto, nella directory IBDesignables, è possibile notare che è stato creato solo il target del framework.

Il generatore di interfaccia carica effettivamente il framework utilizzando dlopen manualmente. Puoi anche vedere che per facilitare questo quando costruisci il tuo framework, Interface Builder aggiunge effettivamente 2 RPATH s al tuo binario, quindi le dipendenze possono essere trovate nei percorsi personalizzati (puoi vederlo con otool -L frameworkbinary). Questo metodo di caricamento del tuo binario non è possibile con le librerie statiche.

Per quello che vale Penso che il miglior soluzione per questo è di costruire quadri dinamici, invece di librerie statiche, ma solo per IBDesignable costruisce. Dovrai fare un po 'di lavoro di configurazione per farlo, e non è facile aggirare Xcode per farlo funzionare, ma se lo provi, puoi usare sia il percorso di compilazione, sia l'ambiente, per differenziare le build IBDesignable vs build "normali".

+0

Come crei configurazioni separate per le build "normali" e "' 'IBDesignable'''? Mi piacerebbe usare gli elementi dell'interfaccia utente '' 'IBDesignable''', ma non posso passare alle librerie dinamiche. – Coli88

+0

È possibile eseguire questa operazione sovrascrivendo l'impostazione di build 'LD' non documentata, che sostituisce l'eseguibile di default ld e modificare le impostazioni in base alla directory di build, che include solo IBDesginables per queste build. Vedere https://github.com/keith/swift-staticlibs per un esempio di utilizzo di questa impostazione di build e l'analisi degli argomenti passati a ld. –