源碼下載:http://www.oschina.net/code/snippet_616092_14113 sql
前段時間用UITableView作了一個獲取document下的樹形文件列表,不一樣於網上其餘用plist或sqllite預約義好文件level,該程序根據文件夾層次,自動分級別。該文件列表的實現思路,以及代碼以下。數組
一、首先,建立工程,並添加rootViewController,在rootViewController中添加UITableView控件,設置其dataSource及delegate爲self或者任何其餘類。
spa
二、UITableViewCell是根據路徑肯定顯示的labelText.text的內容的,因此,咱們須要獲取每一個UITableViewCell對應的路徑,另外,返回上級目錄的時候,也是根據路徑及級別reload,tableView的。因此,咱們先建立一個包含level,和pathName兩個字段的數據模型CellModel。.net
三、肯定數據模型後,根據給定的初始path設置cellModel對象,並把該對象存到全局的NSMutableArray裏。code
self.modelArray = [[NSMutableArray alloc] init];component
CellModel * cellmode = [[CellModel alloc] init];對象
cellmode.pathName = FILELIST_DIR;//FILELIST_DIR是個宏定義,定義了初始路徑。ip
cellmode.level = 0;rem
[self.modelArray addObject:cellmode];源碼
[cellmode release];
四、獲取某個路徑下的文件及文件夾:
NSArray * tempArray = (NSArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
判斷這個文件是不是文件夾;
BOOL isDir = NO;
[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
五、關於列表的加載和刷新,返回,其實就是更換全局可變數組modelArray裏面的數據。而modelArray的數據是根據你每次點擊的UITabelViewCell肯定的。最關鍵的代碼在UITableView的delegate方法- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath,該方法主要做用是根據點擊的cell對應的cellModel對象reload對應的數據。該方法代碼以下:
static int levels = 0;//文件的級別。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
CellModel * cellmodel = (CellModel *)[modelArray objectAtIndex:indexPath.row];//得到當前文件目錄路徑
levels = cellmodel.level;//獲得文件級別
path = cellmodel.pathName;
NSError * error = [[NSError alloc] init];
NSArray * tempArray = (NSArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];//獲得該目錄的子目錄
NSArray * array = [NSArray arrayWithArray:self.modelArray];
for (CellModel * model in array)
{
if(model.level > levels)
{
[self.modelArray removeObject:model];//根據目錄級別,刪除大於該級別的文件
}
}
BOOL isDir = NO;
[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
if(isDir)//判斷點擊的是否爲文件夾
{
int count = indexPath.row + 1;
NSMutableArray * files = [NSMutableArray arrayWithArray:tempArray];
for(NSString * fileName in tempArray)
{
if([fileName rangeOfString:@"."].length != NSNotFound)//判斷獲取的文件是不是以.開頭的,是的話就刪掉
{
NSArray * array = [fileName componentsSeparatedByString:@"."];
if(([array count] == 2)&&[[array objectAtIndex:0] isEqualToString:@""])
{
[files removeObject:fileName];
}
}
}
for(NSString * fileName in files)
{
NSString * pathName = [path stringByAppendingPathComponent:fileName];
CellModel * model = [[CellModel alloc] init];
model.pathName = pathName;
model.level = indexPath.row + 1;//在此設置子文件的級別
[self.modelArray insertObject:model atIndex:count++];//把子文件對象插入到數組中
[model release];
}
NSArray * mement = [NSArray arrayWithArray:self.modelArray];
for(CellModel * model in mement)
{
if((model.level == levels) && (![model.pathName isEqualToString:path]))
{
[self.modelArray removeObject:model];//刪掉同級目錄
}
}
[tableView reloadData];
}
}