如何通过按下iPhone中的按钮动态地将行/单元格添加到UITableView

Ran*_*nga 7 iphone objective-c uitableview

最初我有一个只有一个添加按钮的表视图.

当用户按下此按钮时,我需要递增细胞计数并按如下方式添加细胞

如何通过单击"添加"按钮来编写行计数以及如何添加新行

//行数

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return **????** ;
}
Run Code Online (Sandbox Code Playgroud)

//单元格/行上的内容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
       ??????
}
Run Code Online (Sandbox Code Playgroud)

// ###添加新行.. ###

-(IBAction)myAction:(id)sender
{
    ???????? ;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢...

Hel*_*miB 11

UITableView具有插入行或节的属性.见Apple Doc

这方面有很多教程.有2个常用于添加/删除行/节.

insertRowsAtIndexPaths:withRowAnimation:
deleteRowsAtIndexPaths:withRowAnimation:
Run Code Online (Sandbox Code Playgroud)

我已经发布了类似的答案如何使用它: 在iPhone中用开关ON/OFF隐藏表格查看单元格


KAR*_*MED 7

在您的应用程序中当您在btn中执行操作时,您必须向Array添加值.

例如,在tableview中,您将在cell.textLABEL.text中显示NSString.这些字符串在NSMutableArray中.

现在调用buttonAction时

myAction中

{
    NSString *newString =@"NEW CELL";

    [tableArray addObject:newString];
    [tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

在你的应用程序中尝试这个关于你的模态的逻辑.

我希望这个逻辑对你有所帮助.

  • 同意Naveen.请改用insertRowsAtIndexPaths (3认同)
  • 这样可行,但会导致性能下降.要添加一个新的单元格,重新加载整个UITableview是没有意义的. (2认同)

Raf*_*iak 7

每次要添加或删除行时重新加载表视图都会给应用程序用户带来不良体验.尽管它不是执行此任务的有效方式,但它也有一些负面的副作用 - 在重新加载和更改未动画之后,所选行不会保持选中状态.

UITableView具有创建的方法以动态更改表视图的内容.这些是:

insertRowsAtIndexPaths:withRowAnimation:
moveRowAtIndexPath:toIndexPath:
deleteRowsAtIndexPaths:withRowAnimation:
Run Code Online (Sandbox Code Playgroud)

请注意,这些方法允许您指定在执行指定操作时将使用的动画类型 - 当您用于reloadData修改表视图的内容时,无法实现此类行为.

此外,您甚至可以使用表视图的其他方法组合多个表视图操作(这不是必需的):

beginUpdates endUpdates

只需将要执行的操作包装到调用中beginUpdates,endUpdates方法和表视图将为在请求和调用之间请求的所有操作创建一个动画,以便整个过渡看起来更好,由一些单独的动画创建.beginUpdatesendUpdates

[self.tableView beginUpdates]
//calls to insert/move and delete methods   
[self.tableView endUpdates]
Run Code Online (Sandbox Code Playgroud)

保持数据源状态与保持的状态一致非常重要UITableView.因此,您必须确保当表视图开始执行请求的操作时,其数据源将返回正确的值.

[self.tableView beginUpdates]
//calls to insert/move and delete methods   
//operations on our data source so that its
//state is consistent with state of the table view
[self.tableView endUpdates]
Run Code Online (Sandbox Code Playgroud)

表视图何时开始执行操作?这取决于操作是否在由方法beginUpdatesendUpdates方法定义的动画块中.如果是,则表视图在endUpdates方法调用后开始执行操作.否则,表视图在调用insert/move或delete方法后立即执行操作.

当您使用beginUpdatesendUpdates方法对表视图执行操作时,您必须知道在这种情况下表视图,批处理请求的操作并按特定顺序执行它们,这与您在表视图上进行的调用顺序不一定相同对象(Apple关于此主题的文档).

要记住的最重要的事情是删除所有操作总是在所有插入操作之前执行.此外,当以升序执行插入操作时(索引1,2,3的操作),似乎以降序(索引3,2,1的操作)执行删除操作.请记住,这对于保持数据源状态与表视图保持的状态一致至关重要.

花一些时间来分析下面示例中提供的数据源和表视图的操作顺序.

最后的例子:

//initial state of the data source
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy];
//
//...
//

NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0].
                               [NSIndexPath indexPathForRow:0 section:0];
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0],
                            [NSIndexPath indexPathForRow:5 section:0]];

[self.tableView beginUpdates];

[self.numbers removeObjectAtIndex:3];
[self.numbers removeObjectAtIndex:0];

[self.numbers insertObject:@(10) atIndex:4];
[self.numbers insertObject:@(11) atIndex:5];

[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];

[self.tableView endUpdates];
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11
Run Code Online (Sandbox Code Playgroud)