26.02.2014 Aufrufe

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!