Skip to main content

imageNamed non valido (e altri problemi con i resource files) dopo la creazione di un CocoaPod

Qualche giorno fa ho scritto un articolo per illustrare l’integrazione della mia libreria DownPicker su CocoaPods. Come diretta conseguenza del refactoring effettuato per rendere il codice compatibile con i requirements del dependency manager più usato dagli sviluppatori XCode,  alcuni utilizzatori della libreria mi hanno immediatamente fatto notare che la nuova versione, se installata tramite CocoaPods, non visualizzava più le immagini integrate, nonostante fossero presenti nelle directory /Assets/ , quest’ultima regolarmente inclusa nelle wildcard presenti nel percorso indicato come resource_bundle nel file .podspec relativo al progetto.

Il problema era legato al fatto che il codice non conteneva alcun riferimento al bundle in questione, continuando a cercare l’immagine nella cartella principale del progetto: una pratica che funziona benissimo per un componente esterno inserito manualmente all’interno di un progetto XCode, ma sostanzialmente inadatta per un CocoaPod.

La soluzione è stata molto semplice, è bastato aggiungere un riferimento al bundle relativo al progetto sfruttando un overload aggiuntivo del metodo imageNamed:

Inutile dire che la medesima soluzione si adatta a qualsiasi altro tipo di asset o resource file non trovato. Nel caso in cui siate alle prese con un problema simile, adesso sapete come fare.

Felice sviluppo!

 

DownPicker: aggiunta integrazione con CocoaPods

Alcuni mesi fa ho pubblicato su GitHub il codice sorgente del componente gratuito DownPicker, un controllo per iOS realizzato in Objective-C che consente di trasformare controlli UITextBox in drop-down-list simili a quelle di Android come nell’esempio mostrato nell’immagine sottostante:

UITextField.DownPicker

 

Per ulteriori informazioni sull’installazione di DownPicker e sul suo funzionamento potete leggere questo articolo.

A tal proposito informo che da oggi DownPicker è disponibile anche su CocoaPods, il dependency manager più utilizzato per librerie iOS realizzate in Objective-C e Swift. Se non ne avete mai sentito parlare vi consiglio di leggere la guida ufficiale.

Per installare DownPicker tramite CocoaPods è sufficiente aggiungere la seguente linea al proprio Podfile:

Queste le informazioni relative alla build attualmente pubblicata:

CI Status Version License Platform

E’ ovviamente ancora possibile installare la libreria manualmente, seguendo le istruzioni descritte nella pagina GitHub del progetto e nel file README contenuto nel repository ufficiale.

Ne approfitto per ricordare alcuni link utili per il componente:

Felice sviluppo!

 

DownPicker: una DropDownList / ComboBox per iOS e XCode scritta in Objective-C

Quick links: Project Page – GitHub – Pod

Presto o tardi, sviluppando con XCode per iOS, ci si scontra con la necessità di avere a disposizione un controllo che renda l’utente in grado di selezionare una singola opzione da un elenco a scomparsa. Si tratta di un elemento comune a tutte le UI principali, il cui nome è di solito DropDownList, ComboBox o qualcosa di simile e rispecchia l’aspetto, le funzionalità e le caratteristiche tipiche dell’elemento   <select>  in HTML.

Ad oggi iOS non è provvisto di un elemento di questo tipo: la cosa più simile ad esso è il controllo UIPickerView, che però ha caratteristiche estetiche e funzionali tali da non renderlo sempre utilizzabile nel modo che vogliamo. Tanto per cominciare è molto ingombrante, particolarità che lo rende inadatto a molte schermate di impostazioni dove lo spazio a disposizione è solitamente poco; inoltre, a differenza della sua controparte HTML, il suo aspetto è molto diverso dalle caselle di testo, sbilanciando così l’equilibrio dell’interfaccia utente e costringendo lo sviluppatore a soluzioni non sempre ottimali.

UIPickerView in action: not always pretty.
Il controllo UIPicker in azione: non sempre entusiasmante.

Al contrario, spesso abbiamo bisogno di un controllo leggero e poco invasivo,  in grado di fornire all’utente le informazioni necessarie a interagire per scegliere una opzione senza dover sacrificare una porzione considerevole dello schermo.

Con questo obiettivo in mente ho realizzato DownPicker, un controllo per XCode scritto in Objective-C che emula le caratteristiche estetiche e funzionali di una qualsiasi DropDownList/ComboBox utilizzando nel contempo l’interfaccia nativa di iOS: prevede infatti una UITextField che ha il compito di comunicare all’utente la necessità di effettuare un TAP (e, dopo la selezione, mostrare il risultato selezionato) e un controllo di tipo UIPickerView per gestire la selezione.

Approfondisci

Objective C: allineare una UIView all’interno di una Parent View senza utilizzare la Storyboard

Ho già avuto modo di parlare in un articolo precedente di come a volte sia necessario eliminare da codice i vincoli impostati a livello di Storyboard. In molti casi, una volta rimossi quei vincoli, è necessario impostarne di nuovi: per farlo direttamente da codice possiamo utilizzare il metodo addConstraint, che ci consente di impostare dei vincoli tra il posizionamento di un qualsiasi oggetto e quello di qualsiasi altro oggetto presente nella View.

Nella maggior parte dei casi conviene prendere come riferimento la Parent View del nostro oggetto: vediamo alcuni esempi.

Approfondisci

Objective C: rimuovere da codice i vincoli impostati tramite Storyboard

Da quando XCode le prevede, le UIStoryboard sono diventate una componente quasi imprescindibile per lo sviluppo di qualsiasi app grazie alla semplicità con cui consentono di realizzare l’interfaccia grafica e il posizionamento accurato degli oggetti. Può però capitare di avere la necessità di dover rimuovere da codice i vincoli impostati tramite la Storyboard, ad esempio per cambiare la posizione di un oggetto in conseguenza di un evento attivato dall’interazione dell’utente.

Per far questo ho messo a punto il seguente metodo statico:

Potete inserirlo in una qualsiasi classe helper già presente nel vostro progetto oppure crearne una apposita (la mia si chiama LayoutHelper) e richiamarlo nel seguente modo:

Come potete vedere il metodo può essere configurato per eliminare i vincoli presenti tra la nostra view e quella che la contiene e/o quelle che sono in essa contenute. Inutile dire che tanto l’oggetto self.myView quanto i suoi parent / children possono appartenere a una qualsiasi classe derivata da UIView (UIButton, UIImage, UILabel, etc.).

Ricordate che, una volta rimossi i vincoli definiti a livello di Storyboard, potete impostarne di nuovi direttamente da codice utilizzando il metodo descritto in quest’altro articolo.

Felice sviluppo!

 

Close