添加行后如何更新 UITableView?

Posted

技术标签:

【中文标题】添加行后如何更新 UITableView?【英文标题】:How to update UITableView after adding a row? 【发布时间】:2014-08-31 04:37:09 【问题描述】:

我有一个非常简单的 UITableView。我在这里通过创建一些对象来初始化它并将它们添加到完美的表格视图中:

- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    return self;


- (void)viewDidLoad

    [super viewDidLoad];


    //Instantiate
    lapTimerModel = [[LTModel alloc] init];
    [lapTimerModel addChallenge:@"I made it"];
    [lapTimerModel addChallenge:@"Say the alphabet"];
    [lapTimerModel addChallenge:@"100 Meter Sprint Challenge"];
    [lapTimerModel addChallenge:@"Read the csci342 al spec challenge"];



- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [lapTimerModel numberOfChallenges];



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if(cell == nil)

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    
    LTChallenge *challenge = [lapTimerModel challengeAtIndex:indexPath.row];
    cell.textLabel.text = challenge.name;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;

现在我在这里定义了一个按钮,我想在表格中添加另一行,我创建了一个新对象并添加到其他对象列表中,但它没有添加到 TableView?我想我必须调用一些东西来再次抛出我的对象列表并带来新的对象。

- (IBAction)newAlert:(id)sender 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name"
                                                    message:@"  "
                                                   delegate:self
                                          cancelButtonTitle:@"Cancel"
                                          otherButtonTitles:@"OK", nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex


    if (buttonIndex == 1) 
        NSString *name = [alertView textFieldAtIndex:0].text;
        NSLog(@"%@",name);
        //Create a new challange
        [lapTimerModel addChallenge:name];
        //[self.tableView reloadData]; Not working?!

    



@end

我可以在控制台中看到我在警报中输入的内容。

【问题讨论】:

验证 self.tableView 不是 nil 在您添加的初始数据集之后,检查数据是否被添加到您的数据结构中。 你能显示 LTChallenge / LapTimerModel 的类文件代码吗?我已经使用标准 NSMutableArray 进行了测试,它工作正常,所以我必须假设它与在 reloadData 触发之前向自定义 mutableArray 类添加对象的延迟有关 【参考方案1】:

检查这些:

    您已正确设置 tableView 委托和数据源。 您新添加的数据实际上正在添加到 dataSource。 如果 (buttonIndex == 1) 为真且 [self.tableView reloadData] 正在被调用。

希望这会有所帮助.. :)

【讨论】:

【参考方案2】:

您应该为您的 lapTimerModel 创建一个 iVar

@property (strong, nonatomic) LTModel *lapTimerModel;

并在所有 UITableViewDelegate 函数中调用 self.lapTimerModel。

您可以调用而不是调用 reload 方法

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex


    if (buttonIndex == 1) 
        NSString *name = [alertView textFieldAtIndex:0].text;
        NSLog(@"%@",name);
        //Create a new challange
        [self.lapTimerModel addChallenge:name];
        //[self.tableView reloadData]; Not working?!
        [[self tableView] beginUpdates];
        [[self tableView] reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
        [[self tableView] endUpdates];
    

【讨论】:

以上是关于添加行后如何更新 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中,如何在隐藏行后关闭行的底部边框?

在 UITableView 中插入一些行后,它在 ios 7 中没有滚动

Iphone:UITableView 标题行在 6 行后重复

以编程方式选择行后未调用 UITableView didSelectRowAtIndexPath

删除 TableView 中的行后如何更新 indexPath?

升级项目后:删除现有行后 NSTableVIew 无法正确更新