2012-02-10 9 views
10

下記の画像はTweetbot iPhone applicationのスクリーンショットです。 タップボットの人がテーブルビューで達成したことを達成できる方法を知っていれば尋ねたいことは、以前のtableViewのセルをタップして一連のアクションを表示し、再度タップして消えることです。カスタマイズされたテーブルViewàla Tweetbot

enter image description here

それは本当に格好いいな実装であると私は、将来のプロジェクトでこのバリアントを使用するのが大好きだので、私は練習のためにも、両方のことを行うことができますどのようにあなたの意見を知ることが大好きです。

+0

私は 'tableView:didSelectRowAtIndexPath'メソッドで、彼は単に選択されたインデックスパスで行をリロードすると思います。そしてカスタムセルのタップで、彼はそれ以上のものを作る。 –

答えて

24

ユーザーがセルを選択すると、選択したセルのインデックスパスを保存し、その下に行を追加します。ユーザーが同じ販売を選択した場合は、その下の行を非表示にします。ユーザが別のセルを選択すると、現在選択されているセルを隠し、新たに選択されたセルの下に新しいセルを表示する。

@interface RCTableViewController() 

@property (nonatomic, strong) NSMutableArray *tableViewData; 
@property (nonatomic, strong) NSIndexPath *selectedIndexPath; 

@end 

@implementation RCTableViewController 

@synthesize tableViewData = _tableViewData; 
@synthesize selectedIndexPath = _selectedIndexPath; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableViewData = [NSMutableArray arrayWithObjects: 
       @"Cell 0", 
       @"Cell 1", 
       @"Cell 2", 
       @"Cell 3", 
       @"Cell 4", 
       @"Cell 5", 
       @"Cell 6", 
       @"Cell 7", 
       @"Cell 8", 
       nil]; 
    self.selectedIndexPath = nil; 
    [self.tableView reloadData]; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.tableViewData.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 

    if (indexPath == self.selectedIndexPath) { 
     static NSString *DropDownCellIdentifier = @"DropDownCell"; 

     cell = [tableView dequeueReusableCellWithIdentifier:DropDownCellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:DropDownCellIdentifier]; 
     } 

     cell.textLabel.text = @"Drop Down Cell"; 

    } else { 
     static NSString *DataCellIdentifier = @"DataCell"; 

     cell = [tableView dequeueReusableCellWithIdentifier:DataCellIdentifier]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:DataCellIdentifier]; 
     } 

     cell.textLabel.text = [self.tableViewData objectAtIndex:indexPath.row]; 
    } 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSIndexPath *dropDownCellIndexPath = [NSIndexPath indexPathForRow:indexPath.row + 1 
                  inSection:indexPath.section]; 

    if (!self.selectedIndexPath) { 
     // Show Drop Down Cell   
     [self.tableViewData insertObject:@"Drop Down Cell" atIndex:dropDownCellIndexPath.row]; 

     [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:dropDownCellIndexPath] 
         withRowAnimation:UITableViewRowAnimationTop];   

     self.selectedIndexPath = indexPath;  
    } else { 
     NSIndexPath *currentdropDownCellIndexPath = [NSIndexPath indexPathForRow:self.selectedIndexPath.row + 1 
                   inSection:self.selectedIndexPath.section]; 

     if (indexPath.row == self.selectedIndexPath.row) { 
      // Hide Drop Down Cell 
      [self.tableViewData removeObjectAtIndex:currentdropDownCellIndexPath.row]; 

      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:currentdropDownCellIndexPath] 
          withRowAnimation:UITableViewRowAnimationTop]; 

      self.selectedIndexPath = nil; 
     } else if (indexPath.row == currentdropDownCellIndexPath.row) { 
      // Dropdown Cell Selected - No Action 
      return; 
     } else { 
      // Switch Dropdown Cell Location  
      [tableView beginUpdates]; 
      // Hide Dropdown Cell 
      [self.tableViewData removeObjectAtIndex:currentdropDownCellIndexPath.row]; 

      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:currentdropDownCellIndexPath] 
          withRowAnimation:UITableViewRowAnimationAutomatic]; 

      // Show Dropdown Cell    
      NSInteger dropDownCellRow = indexPath.row + ((indexPath.row >= currentdropDownCellIndexPath.row) ? 0 : 1); 
      dropDownCellIndexPath = [NSIndexPath indexPathForRow:dropDownCellRow 
                 inSection:indexPath.section]; 


      [self.tableViewData insertObject:@"Drop Down Cell" atIndex:dropDownCellIndexPath.row]; 

      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:dropDownCellIndexPath] 
          withRowAnimation:UITableViewRowAnimationAutomatic];   

      self.selectedIndexPath = [NSIndexPath indexPathForRow:dropDownCellIndexPath.row - 1 
                 inSection:dropDownCellIndexPath.section]; 
      [tableView endUpdates];        
     }   
    } 
} 

@end 
+0

すてきなアドバイス、ありがとうございます。 – Francesco

+0

素敵でとても役に立つコードをありがとう! – Lindemann

関連する問題