我需要在iOS应用中创建可扩展列表视图,即。如果你点击一个单元格,它应该扩大以提供更多的单元格。我正在关注此链接中给出的示例:Toggle showing/hiding child table cells iOS 此处给出了实现文件的代码:http://pastie.org/7756763iOS中的可扩展列表视图
但是,在上面的示例中,数组是固定的。我有一个sqlite数据库,用于存储任务和其开始日期等。我需要创建一个可展开的视图,其中不同的行是不同的开始日期,当我点击日期时,它应该给出该日期的任务。下面的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
allDates = [[NSMutableArray alloc]init];
self.date = [[NSMutableArray alloc] initWithObjects: nil];
// self.date = [[NSMutableArray alloc]init];
self.listOfSections_DataSource = [[NSMutableArray alloc]initWithObjects:nil];
sqlite3_stmt *statement;
const char *dbpath = [mDatabasePath UTF8String];
if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
const char *query_stmt = [selectSQL UTF8String];
if (sqlite3_prepare_v2(mDiary,
query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
[allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]];
[self.date addObject:tempTaskName];
}
}
sqlite3_finalize(statement);
}
sqlite3_close(mDiary);
NSLog(@"%i",[allDates count]);
for(int x = 0;x < [allDates count];x++)
{
if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
const char *query_stmt = [selectSQL UTF8String];
if (sqlite3_prepare_v2(mDiary,
query_stmt, -1, &statement, NULL) == SQLITE_OK){
temp = [[NSMutableArray alloc]init];
while(sqlite3_step(statement) == SQLITE_ROW)
{
tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
NSLog(@"%@",tempTaskName);
// [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]];
if([[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)] isEqualToString:allDates[x]])
{
[self.temp addObject:tempTaskName];
}
}
NSLog(@"task name%@",temp);
[listOfSections_DataSource addObject:temp];
} sqlite3_finalize(statement);
}
sqlite3_close(mDiary);
}
//[self.listOfSections_DataSource addObject:allDates];
NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
listOfSections = [[NSMutableArray alloc]init];
for (int i = 0;i<[allDates count]; i++) {
[listOfSections addObject:emptyArray];
}
self.selectedSection = -1;
self.selectedSectionTail = -1;
}
表视图的方法是:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [listOfSections_DataSource count];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(selectedSection !=section)
return 1;
else{
NSArray *array = [listOfSections objectAtIndex:section];
return [array count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"cell";
if(self.selectedSection == indexPath.section){//this is just to check to see if this section is the one we touched
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSArray *myArray = [listOfSections_DataSource objectAtIndex:indexPath.section];//this now contains your cities
NSString* myString = [myArray objectAtIndex:indexPath.row]; // get city for that row, under the state
cell.textLabel.text = myString;
return cell;
}
else{//THIS IS going to happen the first time
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"more";
return cell;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
//check to see if the cell is for exapnding or for selection
if([cell.textLabel.text isEqualToString:@"more"]){ // this means we need to expand
listOfSections = [[NSMutableArray alloc]init];
//setting up the list of section with empty arrays
NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
for (int i = 0;i<[allDates count]; i++) {
[listOfSections addObject:emptyArray];
}
//Add array of tasks here
[listOfSections replaceObjectAtIndex:indexPath.section withObject:[listOfSections_DataSource objectAtIndex:indexPath.section]];
int tapedRow = [indexPath section];
self.selectedSection = tapedRow;
NSMutableIndexSet *myIndexSet = [[NSMutableIndexSet alloc]init];
[myIndexSet addIndex:selectedSection];
[myIndexSet addIndex:selectedSectionTail];
// Updating section in the tableview
if(selectedSectionTail!=-1)
[taskTable reloadSections:(NSIndexSet*)myIndexSet withRowAnimation:UITableViewRowAnimationFade];
else {
[taskTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:
UITableViewRowAnimationFade];
}
//[taskTable reloadData];
}
else{
}
selectedSectionTail = selectedSection;
}
这里的问题就在于: 1段号,显示在屏幕上是正确的,但在第一个单元被窃听,它消失了。 2.当任何单元被点击时,列表不会被展开。
请任何人都可以帮我吗?谢谢..
感谢..但我已经通过这个走了..它从一个plist中举人的数据,而不是从一个阵列 – 2013-05-03 09:17:08
@ Crazed'n'Dazed使用的.plist你有NSDictionary中加载它,并且我想NSDictionary在提供的例子中有一些NSArray。您应该再次检查它 – 2013-05-03 09:48:39
您也可以修改样本以从Array读取而不是plist。 – canhazbits 2013-05-03 17:07:14