Git: file is missing

Quando si usare git su Xocde può capitare che qualcosa vada storto e dei file, magari semplicemente spostati da una cartella ad un altra, risultino mancanti.

È questo il caso di quando appare nella schermata del Commit un punto interrogativo a fianco ad un file e nell’editor di fianco il messaggio:

1
file is missing
file is missing

Ovviamente questo può accadere anche ad una cartella.

Per ovviare a questo fastidioso problema, che provoca anche dei relativi Warning in fase di compilazione, è sufficiente aprire il Terminale, posizionarsi nella cartella del progetto, e forzare un commit con questo comando:

1
git commit -a -m "Commit Message"
git commit -a -m "Commit Message"

A volte, se avete più Xocde installati, potrebbe essere necessario specificare dove si trova la versione che state usando:

1
sudo xcode-select --switch /Applications/Xcode\ 8/Xcode.app
sudo xcode-select --switch /Applications/Xcode\ 8/Xcode.app

The data couldn’t be read because it isn’t in the correct format: ecco come validare un file .plist

Xcode permette di modificare un plist anche in vista “Source Code”, molto comoda per modifiche massicce. Però quando si commette un errore e la sintassi non è più quella corretta, Xcode avvisa solo per il formato non è valido, senza alcuna indicazione sulla riga di codice errata: “The data couldn’t be read because it isn’t in the correct format”.

Inoltre non permette di tornare alla vista Property List finché non si è trovato l’errore.

Per poter validare un plist e trovare gli errori allora basta aprire il Terminale, spostarsi nella cartella del file plist e digitare

1
plutil file-name.plist
plutil file-name.plist

Questo restituirà l’elenco degli errori trovati (es: Encountered misformatted real on line 539) oppure restituirà OK.

Preview dell’Autolayout

Fondamentale per l’uso e l’apprendimento dell’Autolayout è la Preview. Ecco la procedura per attivarla:

  1. Apri uno Storyboard.
  2. Apri l’Assistant Editor
  3. Nell’Assistant Editor, clicca sul quarto pulsante (quello che solitamente dice Manual/Automatic/ecc.).
  4. Scegli “Preview”, in fondo all’elenco.
  5. Ora in basso a destra si può scegliere i dispositivi su cui mostrare la Preview.

Xcode: Autoincrement Build number

Come distinguere in maniera certa una compilazione da un altra? Come sapere, indipendentemente dalla data, quale archivio per l’invio ad Apple è stato creato prima o dopo? È sufficiente utilizzare il Build number, nei settings del progetto in Xcode, appena sotto il Version number. Però modificarlo ogni volta a mano è fastidiosissimo.

Ecco allora che possiamo utilizzare il comodissimo script di sekati:

1
2
3
4
5
6
7
8
9
10
11
12
13
# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)
 
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

In pratica si aggiungono e ultime tre righe ad una nuova Build Phase (si crea cliccando sul + in alto a sinistra). L’autore consigli di spostare questa nuova fase appena sotto “Link Binaries With Libraries”, ovvero appena sotto i framework.

Se il numero di Build è un numero intero, questo viene incrementato ogni volta che si lancia il comando Build o Run, sia per il Simulatore che per un Device, e ogni volta che si archivia per inviare l’app ad Apple.

Comodissimo.

Aggiungere una cartella (es. di file HTML) senza perdere la struttura di sottocartelle

Chi ha voluto inserire una cartella di file HTML all’interno di un progetto Xcode si sarà presto accorto che i file vengono trattati come se fossero tutti dentro la cartella principale, e non distribuiti nelle eventuali sottocartelle. Questo crea problemi, ad esempio, nel linkare i file immagine nel file HTML (che andrebbe modificato ad hoc). Ma non solo.

Per ovviare a questo inconveniente è sufficiente ricordarsi di importare la cartella scegliendo l’opzione “Create folder references for any added folders ” (pur con l’opzione Copy items into destination group’s folder (if needed)” attivata).

Error: Could not load the “…” image referenced from a nib in the bundle with identifier “…”

Può capitare di aggiungere una immagine, o una qualsiasi altra risorsa (anche file di codice .h e .m) ma ricevere questo errore in fase di compilazione:

1
Could not load the "..." image referenced from a nib in the bundle with identifier "…"
Could not load the "..." image referenced from a nib in the bundle with identifier "…"

Questo accade perché il progetto contiene la risorsa ma non è correttamente dichiarata nella sezione “Copy Bundle Resources” che si trova nel “Build Phases” del Target. Basterà quindi aggiungerla manualmente tramite il piccolo pulsante “+” e da quel momento la fase di compilazione non restituirà più questo errore.

A cosa serve il pulsante Exit nello Storyboard?

Se il nostro Storyboard lancia dei segue consecutivi, diciamo dal viewController A al B e poi al C, allora potremmo avere la necessità di tornare al viewController A (questo indipendentemente dal tipo di navigazione), ovvero eseguire il cosiddetto unwind. Per fare questo dobbiamo prima creare in A il metodo

1
2
3
4
- (IBAction)done:(UIStoryboardSegue *)segue {
   // eseguire qualsiasi cosa, anche niente 
 
}
- (IBAction)done:(UIStoryboardSegue *)segue {
   // eseguire qualsiasi cosa, anche niente 

}

e poi collegare in C un UIButton al pulsante Exit in fondo al viewController stesso: compariranno tutti i metodi validi come il precedente, permettendo, al tocco del button di passare dal viewController C all’A.

Se invece colleghiamo il viewController stesso all’Exit (partendo dall’icona gialla sotto l’interfaccia fino all’icona verde dell’Exit) possiamo creare un unwind richiamabile via codice (dopo aver assegnato un Identifier nell’Attribute Inspector), usando il metodo performSegueWithIdentifier.

 

 

Comunicare con un UIContainerViewController

Gli UIContainerViewController sono dei contenitori utilissimi per separare un’interfaccia grafica in parti più piccole e meglio gestibili. Un’enorme semplificazione si può avere nell’uso di una UIScrollView, la cui view contenuta, per essere interamente visualizzabile nello Storyboard, può essere comodo inserirla in una container view.

I problemi nascono quando si vuol fare comunicare il container view con il controller principale che lo contiene. A questo proposito la soluzione più comoda, ma non l’unica, è l’uso dei protocolli. Per uno nemo su come realizzare la struttura del protocollo ecco un utile link.

 

 

Importare un UIViewController e il suo xib in un nuovo progetto

Se abbiamo creato e personalizzato un UIViewController, compreso il suo xib, in un progetto, e siamo stati così bravi da voler riutilizzare il tutto, allora possiamo prendere i file .h, .m e .xib e trascinarli nel nuovo progetto.

Unica accortezza sarà quella di selezionare il corretto target nell’inspector dei file .m e .xib nella proprietà “Target Membership”, questo per evitare di ottenere l’errore seguente:

Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Could not load NIB in bundle: ‘NSBundle <percorso app> (loaded)’ with name ‘<nome controller>”

TIP: app compatibile con il display di iPhone 5

A quanto pare non basta creare un file xib con Xcode 4.5.1, usare l’SDK 6.0 e impostare l’Auto Layout su tale xib.

È assolutamente necessario creare una immagine 640×1136 e usarla come default per l’iPhone Retina da 4.0 pollici, altrimenti l’app continuerà imperterrita ad apparire con bande nere sopra e sotto la view principale.