手风琴风格的tableview不使用部分

时间:2013-08-05 14:06:23

标签: iphone ios objective-c uitableview cells

我在iOS本机应用开发团队实习夏天。他们给了我一个完成在tableview中删除/插入单元格而不使用部分的任务。我正在努力完成任务,如果有人可以看看代码,并试图帮助我id非常感激。我得到一些删除和消失但它不保持一致,并且它正在添加已经可见的单元格。 (在我插入行的意义上的一致性,第3行现在是第5行,我的模运算会被抛弃。

我对目标c很新,所以任何建议/帮助都会非常感激。

@implementation MasterViewController


NSMutableArray * levels;
NSMutableArray * array;
NSMutableIndexSet * expandedSections;
NSMutableDictionary * dict;

-(BOOL) loadFiles{
    //    NSFileManager * fileManager = [NSFileManager defaultManager];
    if (!expandedSections) {
        expandedSections = [[NSMutableIndexSet alloc]init];
    }

    array = [[NSMutableArray alloc]init];
    levels = [[NSMutableArray alloc]init];

    for (int i=0; i<20; i++) {
        NSString * temp = [[NSString alloc]initWithFormat:@"This is row : %i ", i];
        [array addObject:temp];
    }
    for (int i=0; i<20; i++) {
        NSNumber * temp = [[NSNumber alloc]initWithInt:i];
        [levels addObject:temp];
    }


    dict = [[NSMutableDictionary alloc]initWithObjects:array forKeys:levels];
    NSLog(@"TEST: %@", [dict objectForKey:[levels objectAtIndex:1]]);

    return YES;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Master", @"Master");
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadFiles];

// Do any additional setup after loading the view, typically from a nib.
    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc]     initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self   action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)insertNewObject:(id)sender {
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    [_objects insertObject:[NSDate date] atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[indexPath]  withRowAnimation:UITableViewRowAnimationAutomatic];
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if ([expandedSections containsIndex:section]) {
        return [array count] +2;
    }
    return [array count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    if (!(indexPath.row %3)==0) {
        cell.textLabel.text = [dict objectForKey:[levels objectAtIndex:indexPath.row]];
        [cell setIndentationLevel:2];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.accessoryView = nil; 
    } else {
        cell.textLabel.text = [dict objectForKey:[levels objectAtIndex:indexPath.row]];
        [cell setIndentationLevel:0];
    }

    return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_objects removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (!self.detailViewController) {
        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    }
    BOOL currentlyExpanded = [expandedSections containsIndex:indexPath.row];
    //[tableView deselectRowAtIndexPath:indexPath animated:YES];
    NSLog(@"CurrentlyExpanded : %d", currentlyExpanded);
    NSLog(@"TEST: %@", [dict objectForKey:[levels objectAtIndex:indexPath.row ]]);

    if ((indexPath.row %3)==0) {
        // only first row toggles exapand/collapse
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        NSInteger section = indexPath.section;
        BOOL currentlyExpanded = [expandedSections containsIndex:section];
        NSInteger rows;

        NSMutableArray *tmpArray = [NSMutableArray array];

        if (currentlyExpanded) {
            rows = 2;
            [expandedSections removeIndex:section];
        } else {
            [expandedSections addIndex:section];
            rows = 2;
        }

        for (int i=indexPath.row+1; i<=(indexPath.row + rows); i++) {
            NSIndexPath *tmpIndexPath = [NSIndexPath indexPathForRow:i
                                                           inSection:section];
            [tmpArray addObject:tmpIndexPath];
        }

        if (currentlyExpanded) {
            [tableView deleteRowsAtIndexPaths:tmpArray
                             withRowAnimation:UITableViewRowAnimationTop];
        } else {
            [tableView insertRowsAtIndexPaths:tmpArray
                             withRowAnimation:UITableViewRowAnimationTop];
        }    
    }
    if ((indexPath.row %3)>0) {
        NSDate *object = _objects[indexPath.row];
        self.detailViewController.detailItem = object;
        [self.navigationController pushViewController:self.detailViewController animated:YES];
    }
}

@end

1 个答案:

答案 0 :(得分:0)

看看TLIndexPathTools。它极大地简化了构建这样的动态表。它完成了为您计算和执行批量更新的所有工作。尝试运行Outline sample project。它演示了如何在不使用节的情况下构建可扩展树。只需构建一个两级树即可完成所需的任务。