iPhone Code Schnipsel: Maximale Anzahl Zeichen im UITextField begrenzen
Gegeben
Man hat ein UITextField und möchte verhindern, dass ein User mehr als X Zeichen eingeben kann.
Gesucht
Eine Lösung ohne UIAlertView. Es soll nur verhindert werden, dass weitere Zeichen eingegeben werden.
Lösung
Erstmal zwei Konstanten definieren:
static const NSInteger kUserNameMaxLength = 20;
static const NSInteger kTextFieldNameTag = 1;
Dann entsprechend dem UITextField das Tag zuweisen (static const NSInteger) und den delegate setzen:
textField.tag = kTextFieldTagLimited;
textField.delegate = self;
Dann lässt sich das Problem mit dieser UITextFieldDelegate Methode ziemlich einfach lösen:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField.tag == kTextFieldTagLimited) {
NSString *testString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if ([testString length] > kUserNameMaxLength) {
textField.text = [textField.text substringToIndex:kUserNameMaxLength];
return NO;
}
}
return YES;
}
Schlüsselwörter: iphone, objective-c, programmierung, schnipsel
iPhone Code Schnipsel: Clang Static Analyzer
Gegeben
Man hat die ersten ViewController fertig, einiges an Logik geschrieben, so dass die Applikation eigentlich ganz gut funktionieren sollte. Der erste Start endet aber im Debugger und nach kurzem Prüfen ist man sich sicher, dass man irgendwo einen Bug im Object-Lifecycle hat - also ein Retain/Release/Autorelease zu viel oder zu wenig.
Gesucht
Ein schneller Weg, diese Fehler zu finden, ohne seinen eigenen Code noch einmal komplett durchgehen zu müssen.
Lösung
Der Clang Static Analyzer: http://clang-analyzer.llvm.org/
Einfach den letzten Build downloaden und entpacken. Am komfortabelsten ist es, wenn man das Verzeichnis gleich dem PATH hinzufügt. Dann in Xcode ein "Clean All Targets" ausführen und auf der Konsole in das Projektverzeichnis wechseln. Dort gibt man folgendes Kommando ein:
scan-build -k -V xcodebuild -configuration Debug -sdk iphonesimulator3.0
Wenn alles klappt, sollte Clang nun das Projekt scannen und am Ende eine Seite im Default Browser öffnen. Dort findet man dann eine Übersicht aller gefunden Fehler, Bugs und Verstöße gegen Coding Conventions. Die Punkte geht man einzeln durch und bekommt wunderbar erklärte Problembeschreibungen. Das sieht dann z.B. so aus:
Als Folge stehen die Chancen gut, dass der nächste Start der neuen App problemlos klappt.
Schlüsselwörter: iphone, objective-c, programmierung, schnipsel, xcode
Ruby Code Schnipsel: default_scopes und named_scopes
Gegeben
Modell mit folgendem Scope:
named_scope :all,
:conditions => "status = 'original' or status = 'initial'",
:order => "created_at desc"
Gesucht
Beschränkung der Suchmenge über default_scopes, die mit Ruby on Rails 2.3 eingeführt wurden. Versucht man im aktuellen Rails 2.3.2 einen default_scope mit conditions zusammen mit einem oder mehreren named_scopes zu verwenden, gibt es dabei einen Bug beim Mergen der Scopes. Folgende erster Ansatz funktioniert nicht:
default_scope :conditions => "site_id = Site.current.id"
Stattdessen wird eine Fehlermeldung ausgegeben:
TypeError: can't convert String into Hash
from /.../vendor/rails/activerecord/lib/active_record/base.rb:2134:in `merge'
from /.../vendor/rails/activerecord/lib/active_record/base.rb:2134:in `with_scope'
from /.../vendor/rails/activerecord/lib/active_record/base.rb:2112:in `each'
from /.../vendor/rails/activerecord/lib/active_record/base.rb:2112:in `inject'
from /.../vendor/rails/activerecord/lib/active_record/base.rb:2112:in `with_scope'
Auch so geht's nicht:
default_scope :conditions => ["site_id = ?", Site.current.id]
Die Fehlermeldung ist hier TypeError: can't convert Array into Hash bei gleichem Stacktrace.
Lösung
default_scope :conditions => {:site_id => Site.current.id}
Schlüsselwörter: programmierung, ruby on rails, schnipsel
iPhone Code Schnipsel: Kennung des Gerätes
Gesucht
Die Kennung (Identifier bzw. UDID) eines iPhone oder iPod Touch programmatisch ermitteln.
Lösung
UIDevice *device = [UIDevice currentDevice];
NSString *uniqueIdentifier = [device uniqueIdentifier];
UIDevice bietet außerdem Instanzmethoden zur Bestimmung von Name (name) und Modell (model) des Gerätes sowie Name (systemName) und Version (systemVersion) des Betriebssystems. Beispiel für mein iPhone:
Name: MyPhone Model: iPhone SystemName: iPhone OS SystemVersion: 2.2.1
Schlüsselwörter: iphone, programmierung, schnipsel
iPhone Code Schnipsel: Den Benutzer warten lassen
Gegeben
Der Benutzer füllt seine Benutzerdaten in zwei Textfelder ein und klickt dann auf Login. Anschließend wird ein Request an den Server gesendet und abhängig von der Antwort zum Hauptmenü gewechselt oder eine Fehlermeldung angezeigt.
Gesucht
Während des Wartens auf die Antwort soll die aktuelle Ansicht durch ein HUD mit einem UIActivityIndicatorView überlagert werden.
Lösung
Wir laden die Klasse SFHFHUDView in Form der beiden Dateien SFHFHUDView.h und SFHFHUDView.m von GitHub runter und binden diese in unser Xcode-Projekt ein. Anschließend kann das HUD wie folgt erzeugt und angezeigt
SFHFHUDView *HUDView = [[SFHFHUDView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[HUDView setStatusText:@"Connecting..."];
[HUDView setShowsStatusLabel:YES];
[HUDView startActivityIndicator];
[HUDView makeKeyAndVisible];
sowie später wieder entfernt werden:
[HUDView resignKeyWindow];
[HUDView setHidden:YES];
Schlüsselwörter: iphone, programmierung, schnipsel
Auch abrufbar als: Atom
Schlüsselwörter
- berlin (2)
- blog (5)
- browser (2)
- cocoaheads (5)
- dropbox (1)
- git (7)
- idisk (1)
- iphone (28)
- javascript (2)
- kurztip (4)
- linktips (17)
- mac (9)
- macruby (1)
- objective-c (8)
- ortung (1)
- programmierung (22)
- rails (1)
- railsconf (7)
- ruby (6)
- ruby on rails (7)
- schnipsel (14)
- server (2)
- spiele (1)
- statistiken (3)
- stuttgart (3)
- testen (4)
- tidy (1)
- versionskontrolle (5)
- wwdc (1)
- xcode (9)
- xml (1)
