我需要在iOS应用中创建可扩展的列表视图,即。如果你点击一个单元格,它应该扩展以提供更多的单元格。我按照此链接上提供的示例进行操作:Toggle showing/hiding child table cells iOS 此处还给出了实现文件的代码:http://pastie.org/7756763
但是,在上面的示例中,数组是固定的。我有一个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.当点击任何单元格时,列表不会被扩展。
请有人帮帮我吗?感谢..
答案 0 :(得分:2)
此示例可能是您正在寻找的内容:http://developer.apple.com/library/ios/#samplecode/TableViewUpdates/Introduction/Intro.html
示例来自静态数据,但您应该能够更新它以使用数据库中的动态数据,还可以为日期等提供任务。
答案 1 :(得分:2)
JKExpandTableView是一个实现可扩展表视图(UITableView的子类)的开源库,可以帮助您: http://jackkwok.github.io/JKExpandTableView/
查看示例应用。
答案 2 :(得分:1)
我需要的东西现在正在工作,所以我要在这里发布代码:
- (void)viewDidLoad
{
[super viewDidLoad];
BOOL flag = NO;
allDates = [[NSMutableArray alloc]init];
self.date = [[NSMutableArray alloc] init];
// self.date = [[NSMutableArray alloc]init];
self.listOfSections_DataSource = [[NSMutableArray alloc]init];
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);
}
NSLog(@"%i",[allDates count]);
sqlite3_close(mDiary);
self.date = [NSMutableArray arrayWithCapacity:[allDates count]];
for(int p = 0; p < [allDates count]; p++)
{
for(int q = p+1; q < [allDates count]; q++)
{
if([allDates[p] isEqualToString:allDates[q]])
{
flag = YES;
break;
}
}
if(flag)
{
//[self.date addObject:allDates[p]];
[allDates removeObjectAtIndex:p];
}
flag = NO;
}
// NSLog(@"%u",[self.date count]);
// [allDates setArray:self.date];
NSLog(@"allDates count%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);
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];
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
for(int y = 0;y<[allDates count]; y++)
{
if (section == y) {
return allDates[y];
}
}
}
- (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];
}
// cell.textLabel.text = [[listOfSections_DataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
NSArray *myArray = [listOfSections_DataSource objectAtIndex:indexPath.section];//tasks
NSString* myString = [myArray objectAtIndex:indexPath.row]; // get task for that row, under the date
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;
}
我知道必须有更好的方法来做到这一点,但这个解决方案对我有用,所以我决定发布它。
答案 3 :(得分:0)
在Swift 4中:
{{1}}