滑动以删除打破tableviewcell功能的选项

时间:2014-03-26 12:29:32

标签: ios objective-c uitableview cocoa-touch uikit

所以我一直在创建一个tableviewcontroller来处理我的tableview及其tableviewcells .. 这是代码 -

ItemsViewController.h

   #import <UIKit/UIKit.h>
   #import "DetailViewController.h"

    @interface ItemsViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate>

    -(IBAction)addNewItem:(id)sender;

    @end

ItemsViewController.m

    @implementation ItemsViewController

   -(id) init{
      self= [super initWithStyle:UITableViewStyleGrouped];
         if (self) {
            UINavigationItem *n= [self navigationItem];
              [n setTitle:@"Homepwner"];


             for (int i=0; i<5; i++) {
               [[BNRItemStore sharedStore] createItem];
             }

        }
        return self;
     }
    - (id)initWithStyle:(UITableViewStyle)style
     {
           return [self init];

      }
   - (void)viewDidLoad
      {
         NSLog(@"ItemsView loaded");
         [super viewDidLoad];

           UIBarButtonItem *bbi= [[UIBarButtonItem alloc]    initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewItem:)];//Target-Action pair..
         self.navigationItem.rightBarButtonItem= bbi;
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.

        self.navigationItem.leftBarButtonItem = self.editButtonItem;
  }
  -(void)viewWillAppear:(BOOL)animated{
       NSLog(@"ItemsView appearing");
       [super viewWillAppear:animated];
       [[self tableView] reloadData];
   }

   -(IBAction)addNewItem:(id)sender{
       BNRItem *newItem= [[BNRItemStore sharedStore] createItem];
       NSLog(@"%d",[[[BNRItemStore sharedStore] allItems] count]);
       int newRow = [[[BNRItemStore sharedStore] allItems] indexOfObject:newItem];
       NSIndexPath *ip= [NSIndexPath indexPathForRow:newRow inSection:0];
       [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationTop];
    }

   //Row Selection
   -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
         if(indexPath.row<[[BNRItemStore sharedStore] allItems].count){
            NSLog(@"Row# %d selected",indexPath.row);
            DetailViewController *detailViewController= [[DetailViewController alloc] init];
             NSArray *items= [[BNRItemStore sharedStore] allItems];

            BNRItem *item= [items objectAtIndex:indexPath.row];
           detailViewController.item=item;//BNRItem at the selected indexPath.

            //Push it onto the top of the navigation controller's stack
           [[self navigationController] pushViewController:detailViewController animated:YES];
       }
       else{
          return;
     }
   }

   #pragma mark - Table view data source

     - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
       {
            NSLog(@"Test1");
           return 1;
        }

     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
       {
          //#warning Incomplete method implementation.
            // Return the number of rows in the section.
             NSLog(@"Current section- %d",section);

          return [[[BNRItemStore sharedStore] allItems] count]+1 ;//no. of rows (5)+'No more items' row
        }

       - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
         {
             NSLog(@"hello");
           //    NSLog(@"%@",headerView);
           static NSString *CellIdentifier = @"Cell";
         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

          // Configure the cell...
           if (!cell) {
              cell= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
           }
            if (indexPath.row<[[BNRItemStore sharedStore] allItems].count) {
              [[cell textLabel] setText:[[[[BNRItemStore sharedStore] allItems] objectAt  Index:indexPath.row] description]];
           }
           else if (indexPath.row== [[BNRItemStore sharedStore] allItems].count)
            {
                [[cell textLabel] setText:@"No more items"];
            }
            return cell;
         }


           // Override to support conditional editing of the table view.
     - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
       {
           // Return NO if you do not want the specified item to be editable.
             if (self.editing) {
                 NSLog(@"Editing is on");
                 self.navigationItem.rightBarButtonItem.enabled=NO;
                 if (indexPath.row==[[BNRItemStore sharedStore] allItems].count) {
                     [tableView cellForRowAtIndexPath:indexPath].hidden=YES;
                     return NO;// Do not make 'No more items' editable.
                }
       }
       else{//When the user is out of editing mode
           NSLog(@"editing done");
           [self.tableView cellForRowAtIndexPath:indexPath].hidden=NO;
           self.navigationItem.rightBarButtonItem.enabled=YES;
       }

        return YES;
    }



      // Override to support editing the table view.
        - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
     {
         NSLog(@"%@",NSStringFromSelector(_cmd));
           if (editingStyle == UITableViewCellEditingStyleDelete) {
              NSLog(@"Deletion is on");
            // Delete the row from the data source
              NSArray *items= [[BNRItemStore sharedStore] allItems];
              BNRItem *p= [items objectAtIndex:[indexPath row]];
              [[BNRItemStore sharedStore] removeItem:p];
            [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
       }
    }



        // Override to support rearranging the table view.
      - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
        {
          [[BNRItemStore sharedStore] moveItemAtIndex:fromIndexPath.row toIndex:toIndexPath.row];
        }

     -(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedIndexPath{
     if (proposedIndexPath.row==[[BNRItemStore sharedStore] allItems].count) {// 'No more items' row
         return [NSIndexPath indexPathForRow:proposedIndexPath.row-1 inSection:0];
      }
         return proposedIndexPath;
    }
  @end

当编辑模式打开时,即当我点击导航栏上的“编辑”按钮时,“添加”按钮变灰并且“没有更多项目”。行变得隐藏。退出编辑模式后(通过点击“完成”按钮),“添加”按钮变为可选,并且“没有更多项目”。行取消隐藏..当我通过首先进入编辑模式然后退出编辑模式执行编辑时,这一切都很好。但是当我使用滑动删除功能而不使用上述方式时,视图无法实现上述功能(即取消/重新启用 <使用滑动删除时,我完成了删除操作后添加按钮。当我在单元格中轻扫时(以便显示删除按钮)在单元格的右侧,并在过程中显示“添加”按钮,然后选择不按“删除”按钮,只需按住单元格(以便删除按钮消失了) 添加按钮不会自动更新以便启用.. 该怎么做。请先仔细检查我的代码并提供相应的建议..

1 个答案:

答案 0 :(得分:0)

使用此tableView Delegate mathod

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

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
return UITableViewCellEditingStyleDelete;
}


 - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
 {
 return NO;
 }

请使用Apple Library- UItableView