我已经在这里放了几天而且它让我疯狂,问题是我想用动画添加一个单元格到我的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:
返回的值是正确的但老实说我不知道该怎么做
以下是崩溃日志:
这是表的数据源:
- (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;
}
谢谢!
答案 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的文档。