Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using insert rows in a UITableView

I'd like my UITableView to behave like the the table in the Contacts editor, i.e. the user should hit Edit and an "add new category" row should appear at the bottom of each section.

I'm using the below code to do this, but the problem is that there is no smooth transition as there is in Contacts. Instead, the new row suddenly appears. How can I get the animation?

Also, how do I respond to clicks on the "add new category" row? The row is not clickable in my current implementation.

Do I need to reload the data when the user starts editing? I am doing this because otherwise the insertion rows are never drawn.

Thanks.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {     [super setEditing:editing animated:animated];     [self.tableView setEditing:editing animated:animated];     [tableView reloadData]; }  - (NSInteger)tableView:(UITableView *)_tableView numberOfRowsInSection:(NSInteger)section {     // ...     if( self.tableView.editing )          return 1 + rowCount; }  - (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     // .....     NSArray* items = ...;     if( indexPath.row >= [items count] ) {         cell.textLabel.text = @"add new category";     }     // ...      return cell; }  - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {     NSArray* items = ...;      if( indexPath.row == [items count] )         return UITableViewCellEditingStyleInsert;      return UITableViewCellEditingStyleDelete; } 
like image 781
Bill Avatar asked Sep 24 '09 10:09

Bill


People also ask

How do I populate UITableView?

There are two main base ways to populate a tableview. The more popular is through Interface Building, using a prototype cell UI object. The other is strictly through code when you don't need a prototype cell from Interface Builder.

Which method is used to allow moving of row in UITableView?

moveRow(at:to:) Moves the row at a specified location to a destination location.


1 Answers

I was missing one thing. In setEditing:, instead of calling reloadData I should have done:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {     [super setEditing:editing animated:animated];     [self.tableView setEditing:editing animated:animated]; // not needed if super is a UITableViewController      NSMutableArray* paths = [[NSMutableArray alloc] init];      // fill paths of insertion rows here      if( editing )         [self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];     else         [self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];      [paths release]; } 
like image 167
Bill Avatar answered Oct 16 '22 14:10

Bill