Lentamente lo store il Chrome web store si sta popolando di estensioni interessanti e funzionali. In particolare per chi lavora pesantemente con servizi REST segnalo questi 3 strumenti:
Must have
Tags: Chrome, Extensions, json, REST
Lentamente lo store il Chrome web store si sta popolando di estensioni interessanti e funzionali. In particolare per chi lavora pesantemente con servizi REST segnalo questi 3 strumenti:
Must have
Tags: Chrome, Extensions, json, REST
Già perché? Perché fa schifo, semplice. La dimostrazione è la quantità spropositata di forum e messaggi di aiuto che circolano in rete. In particolare XCode 4.2 è flemmatico e ottuso. Purtroppo la storia di questo IDE è costellata da tutta una serie di bug incredibili, di feature mancanti e addirittura di funzionalità rimosse senza spiegazione!
Una approccio ingiustificato da parte di Apple che nonostante tutto continua a trincerarsi dietro un silenzio assordante. Un pratica che io non comprendo e che aborro dal profondo. Questa incuria dei suoi developer che nonostante tutto sono di gran lunga i più fanatici sul globo. Una pratica che permea l’azienda di Cupertino fin dalle origini e che non accenna a diradarsi. L’uscita di iOS5 e XCode 4.2 ne è l’esempio lapalissiano.
Su questi aspetti avrò modo di ritornarci nei successivi post. Dicevamo XCode lento, che fare? Non molto purtroppo, a parte i soliti consigli da mentecatti come “compra più RAM” o “cambia mac” gli unici che mi sento di suggerire veramente sono:
Come si dice “di più ninzò”
Qualche fonte:
Purtroppo non ci sono dati ufficiali sulla precisione, in varie situazioni, del ricevitore GPS montato sull’iPhone 3gs e 4.
Dopo lunghe ricerche mi sono imbattuto su un forum dove sono riportate le seguenti specifiche non ufficiali:
Qualche fonte:
ASIHTTPrequest, per chi ancora non lo conoscesse, è uno dei migliori framework per gestire connessioni http con iOS e Mac OS. E’ diventato il mio framework di riferimento per tutti i progetti che richiedono una comunicazione client/server, tipicamente con servizi REST. ASIHTTPRequest porta con se una ricca dote di funzionalità e semplificazioni non indifferenti, soprattutto se paragonato al blando e scarno NSURLConnection.
Ultimamente sto valutando delle alternative più leggere e moderne. Dopo qualche ricerca mi sono imbattuto in due framework interessanti:
Sicuramente da valutare.
Tags: ASIHTTPRequest, iOS, mac os x, Networking, NSURLConnection
Quando crasha un’applicazione sull’iPhone Simulator viene generato un log con il dettaglio dell’errore, proprio come succede con il device fisico. Se il crash avviene quando non si è in debug con in XCode l’unica possibilità è recuperare questo file tramite il file system.
I crash log del simulatore sono posizionati in questa cartella:
~/Library/Logs/DiagnosticReports/
I file da considerare sono quelli con estensione .crash. Ovviamente
Tags: Crash, iOS, iPhone Simulator, Log, simulator
Ecco un piccolo tip per bloccare lo scrolling di una web view in iOS 4.x. Infatti in tutte le versione dell’SDK fino alla 4.3.5 la UIScrollView presente all’interno della UIWebView non è esposta esternamente. Per poterla modificare è necessario cercarla all’interno delle subviews della web view.
for (id subview in self.webView.subviews) { if ([[subview class] isSubclassOfClass: [UIScrollView class]]) { ((UIScrollView *)subview).scrollEnabled = NO; break; } } // oppure così (anche se è meno sicuro perché non è certo // che la scroll view si trovi sempre nella prima posizione) [[webView.subviews objectAtIndex:0] setScrollEnabled:NO];
E con iOS 5? beh le cose si semplificano di un pelo…
self.webView.scrollView.scrollEnabled = NO;
o no?
Utilizzo quotidianamente git da molti mesi e fin dall’inizio ho sentito l’esigenza di migliorare l’esperienza d’uso di questo strumento. Quello che non tutti sanno è che la versione installata su Mac OSX è configurata in modo essenziale e questo vuol dire che:
$ git config color.ui true
$ mkdir /tmp # se non esiste già $ cd /tmp $ git clone git://git.kernel.org/pub/scm/git/git.git $ cd git $ git checkout v`git --version | awk '{print $3}'` $ cp contrib/completion/git-completion.bash ~/.git-completion.bash $ cd ~ $ rm -rf /tmp/git $ echo -e ">> .profile
$ git stat[tab]
GIT_PS1_SHOWDIRTYSTATE=true if [ -f /opt/local/etc/bash_completion ]; then . /opt/local/etc/bash_completion fi PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
export CLICOLOR=1 export LSCOLORS=GxFxCxDxBxegedabagaced
Il metodo tableView:heightForRowAtIndexPath:indexPath del protocol UITableViewDelegate permette di ridefinire a runtime l’altezza delle celle. Se in una UITableView abbiamo celle di altezze diverse (e magari non note a priori) possiamo sfruttare questo metodo in modo intelligente:
1 2 3 4 5 6 7 | #pragma mark - UITableViewDelegate Methods - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; return cell.frame.size.height; } |
In pratica ricaviamo la cella corrente dal data source e recuperiamo la sua altezza effettiva. Attenzione a non cadere nel subdolo tranello di richiedere la cella corrente direttamente alla tableView (o a self.table) in questo modo:
1 2 3 4 5 6 7 8 | #pragma mark - UITableViewDelegate Methods - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // errore! UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; return cell.frame.size.height; } |
Facendo così si manderà il programma loop! Questo perché la cella non è ancora presente nella tableView ma solo nel datasource. Se si tenta di recuperare la cella direttamente dalla tableView questa, essendone priva, ne richiederà una nuova al data source che a sua volta richiamerà tableView:heightForRowAtIndexPath:indexPath per ottere l’altezza e così via in un circolo senza fine. Anzi no con una fine: EXC_BAD_ACCESS!
Per finire piccola nota sulle performance:
in effetti questo metodo non è molto efficiente in quanto ogni singola cella viene creata due volte, la prima per misurare l’altezza e la seconda volta per poter essere aggiunta alla tabella. E’ chiaro che ci sono ampi margini di miglioramento. Magari li vediamo in un prossimo articolo
Tags: UITableView, UITableViewCell, UiTableViewDataSource, UITableViewDelegate
La funzione NSLog presente nel Foundation Kit è molto comoda in fase di debug di un’applicazione. NSLog non fa altro che stampare a console la stringa passata come argomento. Possiamo rendere NSLog “parlante” aggiungendo delle informazioni interessanti, come il nome del metodo e il numero di linea, ogni volta che viene chiamata.
Per farlo è necessario definire una propria funzione “MYLog” in un header comune o nel file .pch in questo modo:
1 | # define MYLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); |
__PRETTY_FUNCTION__ e __LINE__ sono due macro che hanno proprio lo scopo di visualizzare il nome del metodo e la linea. Ci sono anche altre macro che si posso utilizzare ad ognuno la sua scelta.
Se invece vogliamo fare in modo che queste informazioni siano stampate solo in DEBUG basta aggiungere un if in questo modo:
1 2 3 4 5 | #ifdef DEBUG # define MYLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define MYLog(...) #endif |
Niente di più semplice e funzionale.
Tags: NSLog, obje, objectivec