Joson Daniel
Joson Daniel

Reputation: 409

Push row to top in UItableview in iOS

I have uitableview and it has 1 button "TOP" in each row. I want to when user click on this button, this row has been push on top in Uitableview ( with animation). Can i reuse BVReorderTableView to do that? How can i do that? Thanks much

Upvotes: 2

Views: 1810

Answers (3)

staticVoidMan
staticVoidMan

Reputation: 20274

i am assuming your -cellForRowAtIndexPath loads cell contents from an array such as the one i named arrObjects which:

  1. is an NSMutableArray object
  2. has many NSString objects

something like:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //...
    [cell.textLabel setText:[arrObjects objectAtIndex:indexPath.row]];

    UIButton *btnUp = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btnUp setFrame:CGRectMake(0, 0, 30, 30)];
    //[btnUp setTag:100];
    [btnUp setTitle:@"\u261D" forState:UIControlStateNormal];
    [btnUp addTarget:self
              action:@selector(moveToTop:)
    forControlEvents:UIControlEventTouchUpInside];
    [cell setAccessoryView:btnUp];

    return cell;
}

- (void)moveToTop:(UIButton *)sender
{
    UITableViewCell *cell = (UITableViewCell *)sender.superview; //iOS6 prior
    //UITableViewCell *cell = (UITableViewCell *)sender.superview.superview; //iOS7

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    //uncomment lines for safety, incase indexPath ever comes nil... prevent the crash
    //if (indexPath == nil) {
    //    return;
    //}

    //1. move and animate row to top
    [self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForItem:indexPath.row
                                                           inSection:indexPath.section]
                           toIndexPath:[NSIndexPath indexPathForItem:0
                                                           inSection:indexPath.section]];


    //2. make appropriate changes to the datasource
    //so that it reflects logically and is not just an aestehtical change

    //PRE-NOTE:
    //arrObjects is an object of a category on NSMutableArray
    //with a custom instance method named -moveObjectFromIndexPath:toIndex:

    //uncomment the following line when you are ready with the category
    //[arrObjects moveObjectFromIndex:indexPath.row toIndex:0];
}

the category is easy to create, follow:
http://www.icab.de/blog/2009/11/15/moving-objects-within-an-nsmutablearray/


other links to try:

  1. http://adeem.me/blog/2009/05/29/iphone-sdk-tutorial-add-delete-reorder-uitableview-row/
  2. http://learn-iphone-app-development.com/2011/01/31/tables-part-iii-%E2%80%94-re-ordering-moving-cells-and-swipe-to-delete/

Upvotes: 3

Vincent Sit
Vincent Sit

Reputation: 2362

You can easy do that like this:

[self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];

or:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];

or:

[self.tableView scrollRectToVisible:CGRectMake(0.f, 0.f, CGRectGetWidth(self.tableView.frame), CGRectGetHeight(self.tableView.frame)) animated:YES];

Edit
Sorry, I misunderstood what you meant. You should do that like this:

[tableView moveRowAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

If you want to tableView scroll to the top immediately after move the cell, you can try the above code.

Edit

    // A more detailed description
- (void)buttonHandle:(UIButton *)sender {
    // Assuming button is added directly on the cell.
    UITableViewCell *cell = (UITableViewCell *)sender.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
    [tableView moveRowAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
}

Upvotes: 1

Dinesh
Dinesh

Reputation: 939

have you tried

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

you can use animations if you want so..

Upvotes: 2

Related Questions