【问题标题】:UITableView removing and adding rowsUITableView 删除和添加行
【发布时间】:2014-06-16 15:49:09
【问题描述】:

我有一个 NSMutableArray 包含序列号 1,2...,n 并有一个 UITableView 显示单元格垂直升序并按顺序显示。我将如何在视觉上和数据中以及在 NSMutableArray 中删除 1 和 n 之间的 m 行,然后将数据中已删除单元格之后的所有单元格的值减 1,并且在视觉上如此firstResponder 不会像 reloadData 方法调用那样放弃控制权?

@interface TableController : UIViewController @property (nonatomic, retain) NSMutableArray *data; @end @implementation TableController @synthesize data; - (id)init { if(self = [super init]) { data = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",nil]; } return self; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [data count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [UITableViewCell new]; [cell.textLabel setText:[data objectAtRow:indexPath.row]]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 20; } @end

如何删除第 3 行,然后将第 4 行和第 5 行分别变为 3 和 4?

【问题讨论】:

  • 发布您的尝试并解释您遇到的问题。
  • @maddy 这样更好吗?
  • @Savagewood 不,不是。你在那里有UITableView。哦等等,你刚刚更新了它。
  • @Benjohn 虽然实现单元重用是个好主意。它不是必需的
  • @CrimsonChris 哦,不错,ta :-)

标签: objective-c uitableview data-management


【解决方案1】:

只需编辑您的视图模型,然后重新加载表格。

[data removeObjectAtIndex:2];
[tableView reloadData];

另一个选项是UITableView 方法deleteRowsAtIndexPaths:withRowAnimation:。这种方法是仅 UI,您还必须更新您的视图模型,以防以后重新加载单元格。这种方法的优点是只有您指定的单元格会被更改。现有单元格不会重新加载。

如果您要删除的单元格是您的第一响应者,那么您可以通过告诉下一个单元格成为第一响应者来处理这种情况。

【讨论】:

  • 重新加载数据会使 firstResponder 辞职?还是我错了?
  • 取决于第一响应者是谁。它是细胞之一吗?
  • 不幸的是……我选择了一个糟糕的响应者吗? XD
  • 运行 reloadData 将用新的单元格替换旧单元格,这将迫使他们辞去第一响应者的职务。这是一个单独的问题,可以很好地管理一个新问题。 StackOverflow 上已经有一些关于这个主题的答案。
  • @Benjohn 它然而最简单的解决方案。 +1 在您的答案中显示了 where OP 可以删除的示例。
【解决方案2】:

对于用户驱动的删除,您的[tableview dataSource] 应该实现方法tableView:commitEditingStyle:forRowAtIndexPath:

这是我的代码中的一个实现……

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
  if(editingStyle == UITableViewCellEditingStyleDelete)
  {
    [[STLocationsModel sharedModel] deleteLocationAtIndex: [indexPath row]];
    [tableView deleteRowsAtIndexPaths: @[indexPath] withRowAnimation: UITableViewRowAnimationLeft];
  }
}

要允许编辑,您还需要……

-(BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
  return YES;
}

要使表格进入编辑模式以允许删除,您需要将其置于编辑模式。你可以把它放在你的viewDidLoad,或者你可以用一个按钮来切换它:

[[self tableView] setEditing:YES animated:NO];

如果您还希望能够在编辑表格时进行选择(同样,这可以进入您的 viewDidLoad...

[[self tableView] setAllowsSelectionDuringEditing: YES];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多