Archive

Archive for March, 2010

Mehrsprachige Anwendungen

Neue Strings Datei (Mac OS X Resource) mit dem Namen “Localizable.strings” erstellen und in Resources abspeichern.

Die Datei muss Key/Value Paare enthalten, z.B.:
"Untitled" = "Untitled"

Mit einem Rechtsklick auf die Datei/Get Info/General Make File Localizable wird die Datei als lokalisierbar markiert.

Mit Add Localization können dann weitere Sprachen hinzugefügt werden.

Der Zugriff im Programm erfolgt über folgendes Makro:
NSLocalizedString(@"Untitled", @"Untitled")

Der erste Parameter entspricht dabei dem Schlüssel, der auch in der Lokalisierungsdatei hinterlegt sein muss und der zweite dem Wert, der übernommen wird wenn kein passender Schlüssel gefunden wurde.

Advertisements
Categories: CodeSnippets, iOS, Xcode

Customized UITableViewCell

Eine leere xib erstellen und im Interface Builder die UITableViewCell zusammenbauen.

Eine neue Klasse, die von UITableViewCell abgeleitet ist, erstellen und die benötigten Outlets definieren:


#import 
@interface CustomCell : UITableViewCell {

	IBOutlet UILabel *label1;
	...
}
@property (assign) UILabel * label1;
...
@end

#import "CustomCell.h"
@implementation CustomCell
@synthesize label1;

Dann im Interface Builder den Typ der Cell auf die Klasse CustomCell setzen und die Outlets verbinden.

Im Controller der UITableView:


#import "CustomCell.h"

-(UITableViewCell *) tableView:(UITableView *) tableView 
  cellForRowAtIndexPath:(NSIndexPath *) indexPath {

static NSString *CellIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell *)
  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) {
	NSArray *array = [[NSBundle mainBundle]
  loadNibNamed:@"CustomCell" owner:self options:nil];
	cell = [array lastObject];
}
cell.label1.text = @"some text";
…
}

NSDateFormatter


NSDate *currentDate = [NSDate date]; //  aktuelles Datum und die Uhrzeit
NSString *strDate =  [currentDate description];
NSLog(strDate);
//  Ausgabe: 2008-12-31 14:00:39 +0100

NSDate *currentDate = [NSDate date]; //  aktuelles Datum und die Uhrzeit
NSString *strDate =  [[currentDate 
   dateWithCalendarFormat:@"%d.%m.%Y %H:%M Uhr" timeZone:nil]  description];
NSLog(strDate);
//  Ausgabe: 31.12.2008 14:00 Uhr

Möchte man jedoch sein Datum immer in der aktuell eingestellten Systemsprache formatiert haben, nutzt man am besten den NSDateFormatter. Der große Vorteil ist, das der NSDateFormatter die Konvertierung Landespezifisch vornimmt, z.B.:
29.10.2008 14:49 für Deutschland und
10/29/2008 02:49pm für den englisch sprachigen Raum.
Dabei wird die jeweilige Landesprache durch die Einstellungen im jeweiligen iPhone/iPod Touch festgelegt.

Wie im folgenden gezeigt, wird der NSDateFormatter genutzt:


// aktuelles Datum / Uhrzeit
NSDate* today = [NSDate date];

//  Verhalten für den NSDateFormatter festlegen
[NSDateFormatter  setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];

// NSDateFormatter Objekt erzeugen
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];

// Style für das Datum  festlegen 
[dateFormatter  setDateStyle:NSDateFormatterShortStyle]; // z.B.  08.10.2008

// Style für die Zeit  festlegen
[dateFormatter  setTimeStyle:NSDateFormatterNoStyle]; // keine  Zeitangabe

//  konvertiert das NSDate vom DatePicker in einen String 
NSString *result = [dateFormatter stringFromDate:today];


Folgende Styles können benutzt werden:
Style Datum Zeit
NSDateFormatterNoStyle (es wird nichts dargestellt) (es wird nichts dargestellt)
NSDateFormatterShortStyle 11/23/37 3:30:32pm
NSDateFormatterMediumStyle Nov 23, 1937
NSDateFormatterLongStyle November 23, 1937 3:30:32pm
NSDateFormatterFullStyle Tuesday, April 12, 1952 AD 3:30:42pm PST

Möchtet Ihr eigene Formate Nutzen, solltet Ihr auf des Verhalten NSDateFormatterBehavior10_0 wechseln, welches übriegens auch der Standardeinstellung entspricht, und dann wie folgt den DateFormater nutzen:


NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc]
  initWithDateFormat:@"%1m/%1d/%Y" allowNaturalLanguage:NO] autorelease];
NSString *formattedDateString = [dateFormatter stringFromDate:date]; // Ergebnis wäre z.B. 12/31/2008
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]); [dateFormatter release]; // Ausgabe: Dec 2, 2008 3:58 PM [dateFormatter setDateFormat:@"hh:mm:ss"]; // Ausgabe: 03:58:27

Möchtet Ihr eigene Formate Nutzen, solltet Ihr auf des Verhalten NSDateFormatterBehavior10_0 wechseln, welches übrigens auch der Standardeinstellung entspricht, und dann wie folgt den DateFormater nutzen:


NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] initWithDateFormat:@"%1m/%1d/%Y" allowNaturalLanguage:NO] autorelease]; NSString *formattedDateString = [dateFormatter stringFromDate:date]; // Ergebnis wäre z.B. 12/31/2008
Folgende Formatanweisungen können dabei genutzt werden:
%ccc Kurzform des Wochentagnamens
%cccc Wochentagname
%MMM Kurzform des Monatnamens
%MMMM Monatsname
%d Tag des Monats als Zahl (01-31)
%e das Gleiche wie %d aber ohne führende 0
%F Millisekunden als Zahl (000-999)
%H Stunde (00-23)
%I Stunde (01-12)
%j Tag des Jahres als Zahl (001-366)
%m Monat als Zahl (01-12)
%M Minute (00-59)
%a AM/PM Kennzeichnung
%S Sekunde (00-59)
%w Wochentag als Zahl (0-6), Sonntag ist 0
%y Jahr ohne Jahrtausend (00-99)
%Y Jahr mit Jahrtausend (z.B. 1990)
%Z Zeitzonenname
%z Zeitzone (GMT (HHMM))
Categories: CodeSnippets, iOS

iPhone libraries and frameworks

Categories: iOS, Xcode

Property list

Die Applikationen von Mac OS X und iPhone OS enthalten eine Property list Datei namens Info.plist. In dieser Datei werden Basis-Informationen wie die Programm-Version (Bundle Version), ein eindeutiger Identifier für die App (Bundle Identifier), das Icon der App, … hinterlegt. Der Bundle Identifier wird für das Provisioning Profile benötigt und die Bundle Version muss bei einer neuen Version für den Appstore hochgesetzt werden. Die Werte können recht einfach wieder ausgelesen:

NSString *bundleVersion = [[[NSBundle mainBundle] infoDictionary]objectForKey:@"key"];

  • Die Statusbar kann mit einem Eintrag in der Info.plist entfernt werden: “Status bar is initially hidden” : true
Categories: iOS, Xcode

Interface Builder

XML Interface Builder Dateien .xib enthalten die Proxyobjekte (File’s Owner, First Responder, AppDelegate) der grafischen Oberfläche. Eine .nib-Datei ist das Kompilat einer .xib-Datei. Im Quellcode müssen passende Objekte mit IBAction bzw. IBOutlet markiert werden und können im Anschluss mit den Proxyobjekten im Interace Builder verbunden werden. Mit IBAction wird eine Methode markiert, die aufgerufen werden soll, wenn eine Benutzeraktion erfolgt. IBOutlet wird verwendet, um die Proxyobjekte im Interface Builder mit den Instanzen im Quellcode zu verknüpfen.

  • Wird ein Objekt im Interface Builder vergrößert, werden Hilfslinien angezeigt, wenn die alt-Taste dabei gedrückt wird.
Categories: Interface Builder, iOS, Xcode

Prefix Header

Die .pch-Datei in einem Projekt ist der sogenannte Prefix Header und wird allen Quelldateien eingefügt. Hier können z.B. Konstanten und Makros definiert werden. In folgendem Beispiel kann so das Logging zentral ein-und ausgeschaltet werden, indem das definierte Makro XLog("test") verwendet wird.


#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif

// Constants
#define DEVELOPER_MODE TRUE

#define DEBUG 1
// Switch to release to deactivate logging
//#define RELEASE 1

#ifdef DEBUG

// Debug definitions
#define DEBUG_MODE
#define XLog(msg) NSLog(@”%s “, msg)
//#define XLog(fmt, …) NSLog(@”%s ” fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else

#ifndef RELEASE
#error DEBUG or RELEASE need to be #defined
#endif

// Release definitions
#define RELEASE_MODE
#define XLog(…)

#endif

Categories: CodeSnippets, iOS, Xcode