iPhone multilingual mehrsprachig

localizable strings iPhone XCode

localizable strings iPhone XCode

iPhone Applikationen sind meistens auf einen weltweiten Markt ausgelegt, dabei spielt die Mehrsprachigkeit  eine große Rolle.

Das iPhone SDK bietet dabei eine schöne Möglichkeit dies zu realisieren:

NSLocalizedString(@“TestLocalString“, @“Comment For String“);

Wird überall genutzt wo ein String für den Benutzer ausgegeben werden soll.

Für jede Sprache muss dann eine localized.strings Datei angelegt werden. z.B. en oder de.

Diese legt man so an:

  1. xcode schließen
  2. Drag and duplizieren des settings bundles auf den Desktop (oder irgendwo)
  3. Öffnen des Paketinhalts
  4. Drag Root.strings in den en.lproj Ordner
  5. Duplizieren des en.lproj Ordners und Umbenennung in die gewünschste Sprache (bsp: de)
  6. Ersetzen des alten settings bundle mit dem neuen
  7. XCode öffnen -> die neuen Dateien sollten da sein

Ab dann kann mit den Strings gearbeitet werden. Um die aktuellen Einstellungen des iPhones auszulesen önnen folgende Anweisungen genutzt werden:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@“AppleLanguages“];
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@“Current language: %@“, currentLanguage);

Ein weiteres nettes Feature ist genstrings. Mit diesem Kommando lassen sich die Stringfiles automatisch erzeugen, indem alle .m Files nach LocalizedStrings durchsucht werden.

genstrings -o de.lproj Classes/*.m

Füllt die de file mit Inhalten (vorsicht, es wird immer komplett überschrieben!)

Links zum Artikel:

http://www.iphonesdkarticles.com/2008/11/localizing-iphone-apps.html

http://discussions.apple.com/thread.jspa?threadID=1694551&tstart=0

Facebook iphone app library three20

320

Der Entwickler der Facebook iPhone App Joe Hewitt hat im Zuge der Erstellung der Applikation daran gemacht, die verwendeten Elemente in eine Library zu vereinen.

Kurz und knapp, hier gibts das Teil.

Das ganze nennt sich Three20 in Anlehnung an die 320 Pixel beim iPhone.

[…]

The name of the new project is Three20, after the 320-pixel-wide screen of the iPhone. The code is all hosted on github for your cloning pleasure. There is an excellent sample app called TTCatalog which lets you play with all of the various UI components. Documentation? Well… there are instructions for how to add Three20 to your project, but I am still working on comprehensive documentation for each of the classes. For now, the sample app and the code itself are your documentation.

[…]

Beschrieben werden alle nutzbaren Klassen mit Beispielen und einer sehr aktiven Google Group

cell.image deprecated use setImage

Wer mit einer UITableView arbeitet, wird auch UITableViewCell nutzen. Bei einer TableViewCell kann in der default Zelle ein Bild (UIImage) gesetzt werden.
Auf den ersten Blick nutzt man einfach

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UIImage *theimage = [UIImage imageNamed:@"web.jpg"];
cell.image = webimage;

Dies führt aber zu der Fehlermeldung:

„warning: ’setImage:‘ is deprecated (declared at …“

Lösung:

[cell.imageView setImage:[UIImage imageNamed:@"web.jpg"]];

Der Beitrag passt thematisch zu:

http://www.alexanderjaeger.de/cell-text-deprecated-use-cell-textlabel-text/

UITableView

UITableView

UITableView

UITableView ist ein mächtiges Werkzeug zur Darstellung und Verarbeitung von Informationen. Meistens ist die Anwendung, eine View, ein UITableView in dem eine Reihe von Informationen angezeigt werden. Diese Informationen haben dann jeweils unterschiedliche Actions.

Doch nicht immer trifft dieser UseCase ein, bzw. eine Anpassung der UITableViews ist notwendig. Daher wird hier nach und nach eine Sammlung an Tweaks, Tipps und Kniffen rund um UITableView gesammelt werden.

Hier ein paar Tweaks zum Thema UITableView:

Hintergrund Farbe der ganzen TableView ändern

myTableView.backgroundColor = [UIColor redColor];

Mehrere UITableViews in einer View

Wenn in einer UIView mehrere UITableViews geführt werden, so ist es möglicherweise notwendig, jeder TableView eine unterschiedliche ANzahl an Rows zu geben, dies kann folgendermaßen umgesetzt werden:

(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (tableView == self.myTableView1) {
return 2;
} else if (tableView == self.myTableView2) {
return 3;
} else {
// wird nie erreicht
}
}

Performancetuning

Hier findet man ne coole Möglichkeit, die Höhe einer Zeile performant zu ändern:

http://iphoneincubator.com/blog/windows-views/the-right-way-to-set-the-height-of-tableviewcells

Links zum Thema

http://www.iphonedevsdk.com/forum/iphone-sdk-development/26739-embed-uitableview-within-uiview.html

http://chris-software.com/index.php/dev-center/tables/

http://pessoal.org/blog/2009/02/25/customizing-the-background-border-colors-of-a-uitableview/

http://blogs.remobjects.com/blogs/mh/2009/04/11/displaying_variably_sized_text_cells_in_

UIButton Text ändern

Der UIButton im iPhone SDK Framwork lässt es zu, den Text je nach „Status“ zu ändern.

[myUIButton setTitle:@“Text1″ forState:UIControlStateNormal];
[myUIButton setTitle:@“Text2″ forState:UIControlStateHighlighted];
[myUIButton setTitle:@“Text3″ forState:UIControlStateSelected];

Natürlich können auch bei allen drei der gleiche Text genutzt werden, um den UIButton wie ein UILabel je nach Content zu benennen.

Der Button muss dazu natürlich als IBOutlet deklariert werden und mit dem entsprechenden UIViewcontroller @synthesize werden.

.h File

@property (nonatomic, retain) IBOutlet UIButton *myUIButton;

.m File

@synthesize myUIButton

Im Interfacebuilder muss das Outlet mit dem Button verbunden werden.

Links zum Thema UIButton:

http://chris-software.com/index.php/dev-center/creating-a-nice-glass-buttons/

Custom UITableViewCells with Interface Builder

Hier eine gute Anleitung für eigene Tabellenzellen, dem ist nichts hinzuzufügen.

Sowohl komplett „from scratch“ als auch per „Interface Builder“ wird alles erklärt.

Eine Table-Cell kann dann mittels Labels als Outlets mit Informationen gefüllt werden.

Hier ein Video dazu:

iPhone sleep usleep sleepForTimeInterval NSTimer

3 Möglichkeiten eine iPhone Anwendung zu pausieren:

[NSThread sleepForTimeInterval:5];
sleep(5);
usleep(5000000);

Alle 3 Anweisungen bewirken das gleiche Ergebniss, die Anwenudng wird schlafen gelegt. nachteil aller Optionen: die Anwendung wird wirklich unterbrochen, d.h. weitere Schritte sind nicht möglich.

Wenn man die Anweundung nicht komplett pausieren möchte, könnte der NSTimer ein gewünschtes Ergebniss liefern:

- (IBAction)tueEtwas:(id)sender
{
[indicator startAnimation:self];


// tue etwas


[NSTimer scheduledTimerWithTimeInterval:5
target:self
selector:@selector(stopTueEtwas:)
userInfo:nil
repeats:NO];
}


- (void)stopTueEtwas:(id)sender
{
[indicator stopAnimation:self];
[sender invalidate];
}

Das startet einen NSTimer, der nach 5 Sekunden eine Methode aufruft.

sleep();

usleep();

UISwitch Beispiel

UISwitch

UISwitch

UISwitch ist ein relativ einfaches Objekt. Es hat zwei Zustände: On und Off. Diese können abgerufen werden.

Um ein UISwitch zu nutzen, wird über den Interface Builder ein UISWitch in die Oberfläche gezogen. Im entsprechenden Controller ein Outlet anlegen:

.h File:
[...]IBOutlet UISwitch *mySwitcher;[...]

Zusätzlich noch eine Property:

@property (nonatomic, retain) IBOutlet UISwitch *mySwitcher;

.m File
@synthesize mySwitcher;

Implementierung:

if (mySwitcher.on) NSLog(@"switch Status: on");
else NSLog(@"switch Status: off");

Abschließend noch im Interface Builder die Verbindung zwischen Outlet und dem eigetlichen UIElement herstellen, fertig.

via: chris-software

iPhone tutorial Sammlung: MapKit

MapView

MapView

UKMapKit hat in iPhone OS 3.0 das Licht der Welt erblickt und bietet eine API zu Google Maps an. Damit kann sehr einfach eine Karte in die eigene Anwendung einbinden.

Hier einige gute Artikel zu dem Thema UKMapKit Framework:

Segement Control Action

segment control

segment control

Hier ein nützlicher Codeschnipsel, wie auf Segment Control Actions reagiert werden kann:


// segmented control
-(IBAction)clicksegmentedcontrol:(id)sender{
UISegmentedControl* segmentControl = sender;
NSLog(@"Segment angeklickt");


if([segmentControl selectedSegmentIndex] == 0) {
NSLog(@"Segment 0");
// weiterer Code
} else if([segmentControl selectedSegmentIndex] == 1) {
NSLog(@"Segment 1");
// weiterer Code

}
}

segment control iphone

segment control iphone