Главная » iPhone » Пример iPhone: выбор файлов

0

Одним весьма полезным вариантом использования списка разделов является возможность организации выбора файлов для открытия документов, приложений или относящихся к приложению файлов. Рассматриваемый далее пример определяет класс FileSelector, порожденный от UISectionTable. который отображает список файлов, имеющих заданное расширение и расположенных в заданной папке. Заголовками разделов списка разделов являются первые буквы имен файлов.

Чтобы воспользоваться этим классом, создайте объект FileSelector, потом передайте путь и расширение, которые вы хотите использовать. Затем вызовите метод reloadData, в результате чего просканируется указанная папка и создастся список разделов:

fileSelector = [ [ FileSelector alloc ]

initwithFrame: rect ]; [ fileSelector setPath: @"/Applications" ]; [ fileSelector setExtension: @".app" J; [ fileSelector reloadData ];

После того как список разделов будет построен, он может быть добавлен к существующему виду или задан как содержимое окна. Например:

[ mainView addSubview: fileSelector ];

Источник данных поддерживает несколько различных массивов:

?   files — список объектов UlTableCell, соответствующих каждой строке в списке разделов;

?   filenames — действительные имена файлов каждой строки;

?   sections — список названий разделов, который построен в ходе перечисляющего цикла при сканировании файлов в папке. В качестве заголовков разделов используются первые буквы имен файлов:

?   offsets — список смещений строк, связанных с группировками разделов среди всех четырех массивов. Например, раздел 1 может начинаться в строке 5.

Чтобы скомпилировать данный пример из командной строки, воспользуйтесь пакетом инструментов следующим образом:

$ arm-apple-darwin9-gcc -о MyExample MyExample.m -lobjc ^

-framework UIKit -framework CoreFoundation -framework Foundation

#import <CoreFoundation/CoreFoundation.h> #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <UIKit/UISectionList.h> #import <UIKit/UISectionTable.h> #import <UIKit/UIImageAndTextTableCell.h>

@interface FileSelector : UISectionList

{

UISectionTable *table; NSMutableArray *files; NSMutableArray *filenames; NSMutableArray *sections; NSMutableArray *offsets; NSString *path; NSString *extension;

у

/* Методы FileSelector */

-    (id)initWithFrame:(CGRect)rect;

-    (void)reloadData;

-    (void)setPath:(NSString *)_path;

-    (void)setExtension:(NSString *)_extension;

-    (void)dealloc;

/* Методы источника данных */

-    (int)numberOfSectionsInSectionList:(UISectionList *)aSectionList;

-    (NSString *)sectionList:(UISectionList *)aSectionList titleForSection:(int)section;

-    (int)sectionList:(UISectionList *)aSectionList rowForSection:(int)section;

Листинги 7.15 и 7.16 содержат соответствующий код для таблицы выбора файлов, а в листингах 7.17 и 7.18 приведено само приложение.

-    (int) numberOfRowsInTable: (UITable *)table;

- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col; @end

#import "FileSelector.h"

@implementation FileSelector

-     (id)initWithFrame:(CGRect)rect { self = [ super initWithFrame: rect ]; if (nil != self) {

path = nil; extension = nil;

files = [ [ NSMutableArray alloc ] init ]; sections = [ t NSMutableArray alloc ] init ]; offsets = [ [ NSMutableArray alloc ] init ]; filenames = [ [ NSMutableArray alloc ] init ];

[ self setShouldHideHeaderlnShortLists: NO ]; [ self setDataSource: self ];

}

return self;

}

-     (void)reloadData { NSString *file;

NSDirectoryEnumerator *dirEnum;

char cFileName [256], lastSection[2], mySection[2];

if (path == nil || extension == nil) { return;

)

[ files removeAHObjects ] ; [ sections removeAHObjects ];

[ offsets removeAHObjects ]; [ filenames removeAllObjects ];

dirEnum = ( [ NSFileManager defaultManager ]

enumeratorAtPath: path ]; while ({file = [ dirEnum nextObject ])) { if ([ file hasSuffix: extension ] == YES) { UIImageAndTextTableCell *cell = [

[ UIImageAndTextTableCell alloc ] init

1;

[ cell setTitle: [ file substringToIndex: [ file length ] – 4 ] ];

strlcpy(cFileName,

[ file cStringUsingEncoding: NSASCIIStringEncoding ], sizeof(cFileName)) ; mySection[0] = toupper(cFileName[0]); mySection[l] = 0;

if (mySection[0] >= ‘0* s& mySection[0] <= ‘9’) { mySection[0] = * 0′;

}

if ([ sections count ] > 0) {

NSString *lastSectionName = [ sections objectAtIndex: [ sections count ] – 1

];

strlcpy(lastSection, [ lastSectionName cStringUsingEncoding: NSASCIIStringEncoding ], sizeof(lastSection));

if (mySection[0] != lastSection[0]) { [ sections addObject: [

[ NSString alloc ] initWithCString: mySection ]

] ;

[ offsets addObject:

[ NSNumber numberWithlnt: [ files count ] + 1 ]

1;

}

} else {

[ sections addObject: (

[ NSString alloc ] initWithCString: mySection ]

];

[ offsets addObject: [ NSNumber numberWithlnt: [ files count ] + 1 ]

J;

}

t files addObject: cell ];

[ filenames addObject: file J; }

}

table = [ self table ];

UITableColumn * column = [ [ UITableColumn alloc ] initWithTitle:@"Filename" identifier:@"filename" width: 320.0 ]; [ table addTableColumn: column ]; [ table serSeparatorStyle: 1 ]; [ table setRowHeight: 48.0 ]; [ table setDelegate: self ];

[ super reloadData ] ;

}

- (void)setPath:(NSString *)_path { path = _path;

-    (void)setExtension:(NSString *)_extension { extension = _extension;

}

-    (void)dealloc {

[ self dealloc ]; [ files dealloc ]; [ filenames dealloc ]; [ sections dealloc ]; [ offsets dealloc ]; [ super dealloc ];

)

-    (int)numberOfSectionsInSectionList:(UISectionList *)aSectionList { return [ sections count ];

}

-    (NSString *)sectionList:(UISectionList *)aSectionList titleForSection:(int)section

{

return [ sections objectAtIndex: section ];

}

-    (int)sectionList:(UISectionList *)aSectionList

rowForSection:(int)section

{

return ([ [ offsets objectAtIndex: section ] intValue ] – 1);

}

-    (int) numberOfRowsinTable: (UiTable *)table

{

return [ files count ];

-    (UITableCell *) table: (UITable *)table cellForRow: (int)row

column: (int) col

{

return [ files objectAtIndex: row ];

}

-    (UITableCell *) table: (UITable *)table cellForRow: (int) row column:

(int)col

reusing: (BOOL) reusing

{

return [ files objectAtIndex: row ];

}

-    (void)tableRowSelected:(NSNotification *)notification { NSString *file = [ filenames objectAtlndex:

[ table selectedRow ]

];

printf("Selected: %s\n", [ file

cStringUsingEncoding: NSASCIIStringEncoding ]);

}

Send

#import   <CoreFoundation/CoreFoundation.h>

#import   <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "FileSelector.h"

@interface MyApp : UIApplication {

UlWindow *window;

# import "MyExample.h"

int main(int argc, char **argv)

{

return UIApplicationMain(argc, argv, ©"MyApp", ©"MyApp");

)

©implementation MyApp

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { window = [ [ UlWindow alloc ] initWithContentRect: [ UIHardware fullScreenApplicationContentRect ]

];

CGRect rect = [ UIHardware fullScreenApplicationContentRect ]; rect.origin.x = rect.origin.у = O.Of;

FileSelector *fileSelector = [ [ FileSelector alloc ] initWithFrame: rect

];

[ fileSelector setPath: ©"/Applications" ]; [ fileSelector setExtension: @".app" ]; [ fileSelector reloadData ];

[ window setContentView: fileSelector ]; [ window orderFront: self ]; t window makeKey: self ]; [ window _setHidden: NO ];

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; @end

©end

Как это работает

1.    При порождении приложения оно создает объект FileSelector и вызывает метод initwithFrame. Тем самым создаются необходимые объекты для хранения строк списка резделов.

2.     Вызываются методы set Path и setExtension для назначения папки и расширения файла, которые хочет использовать вызывающий. Затем вызывается метод reloadData, что приводит к сканированию папки и построению списка файлов, заголовоков разделов и ячеек для каждой строки в списке разедлов. Наконец, список разделов задается как содержимое окна.

3.     Вызывается источник данных, являющийся замкнутым внутри класса выбора файлов, для получения информации о количестве разделов и строк в таблице. Запрашиваются названия разделов, подсчитывается количество строк в каждом разделе.

4.     После отображения списка разделов попавшие в зону видимости строки приводят к вызову метода cellForRow источника данных. Этот метод возвращает ячейку, соответствующую запрошенной строке.

5.     Когда пользователь выбирает какой-либо элемент, вызывается метод tableRowSelected. Он ищет имя файла в локальном индексе. С этого момента за выполнение необходимых действий начинает отвечать код разработчика.

Для дальнейшего изучения

?   Измените этот пример, чтобы вместо более экстравагантного класса

UISectionList использовать только класс UISectionTable.

?   Проверьте наличие прототипов UISectionList.h и UISectionTabIe.il в папке include пакета инструментов. Их можно найти в папке /toolchain/sys/ usr/incIude/UIKit.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии