添加单元格到tableview与动画不起作用?

时间:2014-03-12 21:47:04

标签: ios objective-c animation uitableview

我已经在这里放了几天而且它让我疯狂,问题是我想用动画添加一个单元格到我的tableview但是从文本字段返回时(这是我希望动画发生的时候)它崩溃,显然我的代码有问题,所以我需要你的帮助!!谢谢!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    self.tasks = [[NSMutableArray alloc] initWithArray:[userDefaults objectForKey:@"tasks"]];
    if(!self.tasks)
    {
        self.tasks = [NSMutableArray new];
    }
    [self.tasks addObject:textField.text];
    [userDefaults setObject:self.tasks forKey:@"tasks"] ;


    [self.tableview beginUpdates];

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:(self.tasks.count - 1) inSection:0];
[self.tableview insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

    [self.tableview endUpdates];

 }

有人告诉我,在调用endUpdates之前,我需要确保我的模型已更新,以便从tableView:numberOfRowsInSection:返回的值是正确的但老实说我不知道​​该怎么做

以下是崩溃日志: enter image description here

这是表的数据源:

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    TaskCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.taskTitle.text = (self.tasks)[indexPath.row];
    return cell;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信你在这里有一个错误的错误。

通过将行设置为self.tasks.count,您实际上增加了太多。我假设你想把它添加到最后,因此只需减去一个。

NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:(self.tasks.count - 1) 
                                               inSection:0];

此外,您要确保在numberOfRowsInSection:中返回数组的长度,因此请勿使用self.TasksArray.count使用self.tasks.count。与您的单元格相同:self.tasks[indexPath.row]

此外,作为旁注,请务必将您的更改同步到userDefaults,否则它不会传播。

更新 - 改进self.tasks

每次添加项目时,不要重新初始化self.tasks,而是在viewDidLoad方法中将其初始化为可变数组。

self.tasks = [[NSMutableArray alloc] 
                initWithArray:[userDefaults objectForKey:@"tasks"]];

然后,当您创建新任务时,您需要做的就是添加它:

[self.tasks addObject:textField.text];
[userDefaults setObject:self.tasks forKey:@"tasks"];
[userDefaults synchronize];

无需检查是否已创建。请参阅synchronize的文档。