smart developer Ein Code für alle (Vorschau)
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Entwicklung<br />
Filesharing mit iOS<br />
keine direkte Möglichkeit zur Abfrage, ob ein<br />
bestimmtes Verzeichnis existiert oder nicht.<br />
Stattdessen können Sie jedoch die Methode<br />
fileExistsAtPath:isDirectory verwenden.<br />
Diese ist zwar in der Verwendung etwas<br />
eigen, erfüllt aber ihren Zweck anstandslos.<br />
Existiert das gewünschte Ausgabeverzeichnis<br />
nicht, dann legt es die Methode createDirectoryAtPath<br />
an.<br />
Für Simulanten<br />
Das Dokumentenverzeichnis zu ermitteln<br />
und neue Unterverzeichnisse zu erstellen,<br />
funktioniert auf dem Device selbst, ebenso<br />
wie im Simulator. Es ist nicht nötig, im<br />
Quellcode eine Unterscheidung zu treffen.<br />
Allerdings ist es nicht möglich, mittels iTunes<br />
auf den Simulator zuzugreifen. Stattdessen<br />
verwendet man einfach den Finder und arbeitet<br />
direkt auf Dateiebene.<br />
Wie auf dem echten Gerät hat jede App<br />
ihren eigenen Platz <strong>für</strong> das Dokumentenverzeichnis.<br />
Fündig wird man unter Library/<br />
Application Support/iPhone Simulator/4.3/<br />
Application/ID/Documents. Die „4.3“ steht<br />
dabei <strong>für</strong> die verwendete iOS-Version und<br />
„ID“ <strong>für</strong> die GUID der aktuellen App.<br />
Auflisten der Bitmaps<br />
Als Nächstes müssen wir uns darum kümmern,<br />
eine Liste zu erstellen, die <strong>alle</strong> Bitmap-<br />
Dateien im Verzeichnis enthält. Das ist nicht<br />
weiter schwer, wie folgender <strong>Code</strong>-Ausschnitt<br />
zeigt:<br />
Zuerst lassen wir uns mittels der Methode<br />
contentsOfDirectoryAtPath:documentsDirectory<br />
ein Array zurückliefern, das die Namen<br />
sämtlicher Objekte enthält, die sich im Dokumentenverzeichnis<br />
befinden. Dazu zählen<br />
neben den Dateien natürlich auch Unterordner.<br />
Das Filtern dieser Liste übernimmt nicht<br />
der Dateimanager, sondern die Methode<br />
filteredArrayUsingPredicate der Klasse<br />
NSArray. Dazu legen Sie zuerst ein NSArray<br />
an und füllen dieses mit den gewünschten<br />
<strong>Ein</strong>trägen. Unsere App soll nur nach Bitmap-<br />
Dateien suchen, weshalb wir nur bmp übergeben.<br />
Natürlich können Sie weitere Dateiendungen<br />
oder Filterkriterien angeben, wenn<br />
Sie möchten.<br />
<strong>Ein</strong>lesen einer Grafik<br />
Nun stehen sämtliche <strong>für</strong> die Konvertierung<br />
benötigen Informationen bereit und die App<br />
kann die erhaltene Liste der Bitmap-Dateinamen<br />
durchlaufen (Listing 3). Der <strong>Code</strong><br />
durchläuft zuerst die Liste der gefundenen<br />
Dateien, wobei jeder <strong>Ein</strong>trag <strong>für</strong> Debug-Zwecke<br />
in die Log-Datei geschrieben wird. Weiterhin<br />
baut der <strong>Code</strong> die Pfade <strong>für</strong> die Quellund<br />
Zieldateien zusammen. Die Pfadangaben<br />
werden der Methode convertImage übergeben,<br />
die wir uns nun stückchenweise anschauen<br />
(Listing 4).<br />
Damit wir auf dem iPad während des Konvertierungsvorganges<br />
auch etwas zu sehen<br />
bekommen, wurde der App ein Imageview<br />
spendiert, das zu Beginn der Methode convertImage<br />
mit dem aktuell zu bearbeitenden<br />
Bild gefüllt wird. Konvertiert man mehrere<br />
Listing 2: Auflisten der Dateien<br />
// Alle Dateien im Dokumentenverzeichnis auflisten<br />
NSArray *filelist;<br />
filelist = [fileManager contentsOfDirectoryAtPath:documentsDirectory<br />
error:NULL];<br />
// Die erhaltene Liste nach Bitmap‐Dateien filtern<br />
NSArray *bmpFilter = [NSArray arrayWithObjects:@"bmp", nil];<br />
NSArray *bitmapFileList = [filelist filteredArrayUsingPredicate:[NSPredicate p<br />
redicateWithFormat:@"pathExtension IN %@", bmpFilter]];<br />
Listing 3: Durchlaufen der Quellbilder<br />
int count = [bitmapFileList count];<br />
for (int i = 0; i < count; i++) {<br />
NSLog(@"%@", [bitmapFileList objectAtIndex: i]);<br />
NSString *pathOfSourceFile = [NSString stringWithFormat:@"%@/%@",<br />
documentsDirectory, [bitmapFileList objectAtIndex: i]];<br />
NSString *pathOfDestinationFile = [NSString stringWithFormat:@"%@/%@",<br />
destinationDirectory, [bitmapFileList objectAtIndex: i]];<br />
}<br />
[self convertImage: pathOfSourceFile :pathOfDestinationFile];<br />
Listing 4: Öffnen der Datei<br />
‐ (void)convertImage:(NSString*)sourceFileName :(NSString*)destinationFileName<br />
{<br />
imageView.image = [[[UIImage alloc]<br />
ileName] autorelease];<br />
// Datei öffnen<br />
NSFileHandle *fileHandle = [NSFileHandle<br />
Path:sourceFileName];<br />
initWithContentsOfFile:sourceF<br />
fileHandleForReadingAt<br />
}<br />
if (fileHandle == NULL) {<br />
NSLog(@"Failed to load: %@", sourceFileName);<br />
return;<br />
}<br />
else {<br />
NSLog(@"File %@ loaded successfully", sourceFileName);<br />
<strong>smart</strong>-<strong>developer</strong>.de 02/2011 57