2009-02-11 17 views
11

Ho un'applicazione per iPhone che ha gusti diversi dalla pelle, con diverse risorse artistiche e suoni, ma tutto lo stesso codice.Un pennino, diverse risorse. Gruppi?

Ho impostato le cose con più target, ma il problema che sto avendo è che devo avere un diverso set di file di pennini UIBuilder, uno per visualizzazione per target, impostato per puntare all'arte corretta per quell'obiettivo.

Questo è un po 'frustrante, perché se apporto una modifica a un file di pennino, devo apportare manualmente le stesse modifiche, le stesse connessioni, ecc. In tutti gli altri file di pennini. Metto anche tutte le risorse con nomi diversi per le diverse skin, quindi non entrano in collisione nel progetto. Quindi, se ho bersagli A e B, ho a_main_menu.png, b_main_menu.png ... a_FooViewController.xib, b_FooViewController.xib ... ecc

C'è un modo per rendere un file nib che punta ad attività che hanno lo stesso nome, ma sono in ... umm, diversi pacchetti? è per quello che è un pacco? Posso immaginare di aggiustare qualcosa di simile nel mio codice (probabilmente cercare e sostituire A per B nel pennino prima di caricarlo potrebbe anche essere abbastanza buono), anche se non l'ho provato, è brutto.

Questa era una strategia gestibile per il mio primo set di applicazioni (anche se non ottimale), ma man mano che le mie cose diventano più complesse, diventa davvero difficile mantenere sincronizzati i miei file builder, e non è un modo molto SECCO lavorare. C'è un modo migliore di abbandonare Uibuilder e creare le mie opinioni in codice?

Sarebbe bello se questo funzionasse a livello xcode/builder, quindi il costruttore rispetterebbe il mio obiettivo attuale e mostrare l'arte per quell'obiettivo mentre sto lavorando ... ma posso forse vivere senza, come se Potrei selezionare l'attuale set di opere d'arte in fase di esecuzione e sarei in grado di lavorare con un solo set nel builder. Potrei anche farlo con un set di pennini avendo un singolo bersaglio e rimpiazzando manualmente tutta l'arte prima di costruire, ma neanche questo è molto bello.

La cosa migliore sarebbe se potessi combinare le due strategie - come se avessi un obiettivo che ha una visione di più che deve essere presentata in modo diverso ... ma è facoltativo.

Sto chiedendo la domanda giusta?

Grazie!

risposta

1

Supponendo che ogni app necessitasse solo di uno skin alla volta e che si stiano creando più app con temi diversi, vorrei creare un ramo nel mio controllo origine e quindi sostituire le risorse necessarie. Si mantiene un ramo principale con tutte le risorse predefinite e quindi si uniscono le modifiche al codice dal master nei rami nascosti mantenendo tutto sincronizzato.

Git rende questo super facile.

0

Penso che l'opzione migliore sia usare qualcosa come git.

Se si è utilizzato git, è possibile avere un ramo principale che contiene il codice sorgente principale e la logica e disporre di rami secondari con set di dati/immagini diversi per ogni particolare aspetto dell'applicazione. In questa soluzione, XCode non saprebbe nemmeno cosa sta succedendo.

0

Penso che questo è ciò che viewDidLoad è per, per personalizzare di più, qui è possibile modificare il percorso delle immagini.

5

Un modo per farlo è spostare tutte le immagini in un pacchetto separato e caricarle dinamicamente in fase di runtime (un po 'come un "plug-in multimediale").

  • Creare un progetto separato e scegliere "Mac OS X/Framework & Library/Bundle". Chiamalo, per esempio, media.bundle.

  • Sposta tutte le tue opere d'arte in questo progetto.

  • Per semplificare la vita, aggiungere un ulteriore passaggio "Esegui script" alla destinazione copiando l'output generato dalla directory di generazione in una sottocartella sotto il progetto principale. Per renderlo ancora più semplice, aggiungi il pacchetto multimediale come progetto dipendente nel progetto principale in modo che venga automaticamente ricostruito.

Nel vostro progetto principale avrete bisogno di questi due metodi. È possibile farli metodi statici sotto una classe BundleUtils:

+ (NSString *) bundleDirectoryFor:(NSString *) bundleName 
{ 
NSString* basePath = [[[NSBundle mainBundle] resourcePath] 
    stringByAppendingPathComponent:[NSString 
           stringWithFormat:@"%@.bundle", bundleName]]; 
return [[NSBundle bundleWithPath:basePath] resourcePath]; 
} 

+ (NSString *) resourceInBundle:(NSString *)bundleName 
         fileName:(NSString *)fileName 
{ 
NSString *bundlePath = [BundleUtils bundleDirectoryFor:bundleName]; 
return [bundlePath stringByAppendingPathComponent:fileName]; 
} 

Ora, ogni volta che si desidera accedere opere d'arte in bundle, è possibile ottenere il percorso del file a destra con:

NSString* imageFile = [BundleUtils resourceInBundle:@"media.bundle" 
             fileName:@"image.jpg"]; 
UIImage* image = [UIImage imageNamed:imageFile]; 

Ovviamente, il nome "media.bundle" può essere sostituito in runtime per uno diverso in modo da poter passare ad altri bundle in base alle esigenze della tua app. Questo è anche un modo pratico per supportare i contenuti scaricabili (ad esempio, come componenti aggiuntivi a pagamento).

Un avvertimento: questo presuppone che sia necessario caricare le immagini dinamicamente in fase di esecuzione tramite codice. Ma hai anche dei file NIB statici che contengono dei media incorporati. Dovrai trovare un modo per fare in modo che il file NIB statico usi i metodi dinamici per risolvere i nomi dei file multimediali. Un modo è utilizzare MethodSwizzling e guardare i percorsi file con un prefisso di tipo, ad esempio "media: image.png" e reindirizzare quelli per utilizzare i metodi BundleUtil.

Un altro modo è quello di eseguire il layout con IB, quindi convertirlo in codice Obj-C utilizzando nib2objc e quindi sostituire il meccanismo del bundle di plugin.

Spero che questo aiuti.

0

Questo funziona per me:

1 progetto. 2 bersagli a, b. 2 cartelle di immagini per a, b.

Un controller.m e il suo file di pennino è per entrambi i target.

Creare cartelle di file system separate per le immagini dell'obiettivo a e b.

Importare una cartella di immagini su un target a ("aggiungi file a xy" -> "aggiungi a target a/b"), l'altra a target b. Assicurati di utilizzare l'opzione "crea gruppi per cartelle aggiunte". Non selezionare l'opzione "riferimenti cartella".

Quando realizzo il target a, ottengo un'app con immagini dalla cartella a; quando costruisco per b, usa la cartella b per le foto.

Problemi correlati