在第 8 行之后插入新对象,应用程序在使用 NSMutableArray 滚动时崩溃
Inserting new object past row 8 the app crashes on scroll with NSMutableArray
我有一个应用程序可以完成它应该对 UITableView 的前 8 行执行的所有操作...添加第 9 行后(因此 table 视图必须滚动)应用程序崩溃...
我尝试了多种变体,但似乎没有任何效果...我可以根据需要多次向我的行添加单元格,但是一旦我 "fill" [=31] 中的第 9 行=],应用程序崩溃
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
下面是一些代码,用于在 table 视图的行中生成信息(table数据是一个 NSMutable 数组,areaNumber.text 来自一个 customCell )
-(IBAction)save_area:(id)sender {
{
UITableView *tableView = self.myTable;
NSInteger sections = tableView.numberOfSections;
NSMutableArray *cells = [[NSMutableArray alloc] init];
for (int section = 0; section < sections; section++) {
NSInteger rows = [tableView numberOfRowsInSection:section];
for (int row = 0; row < rows; row++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
SodTableCell *cell = [self.myTable cellForRowAtIndexPath:indexPath];//**here, for those cells not in current screen, cell is nil**
[cells addObject:cell];
[tabledata removeObjectAtIndex:indexPath.row];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSObject * object_areaNumber = [prefs objectForKey:@"tablerow_area_input_by_user"];
if(object_areaNumber != nil){
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}
NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
[save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
[save1 synchronize];
NSLog(@"From save button %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}
}
}
}
table 可以在 9 个单元格之外创建一行又一行,如果我想要的话,可以创建数百个,并且滚动有效......当我将信息填充到第 9 行并保存它时使用您在上面看到的代码输入的信息。任何帮助,非常感谢...
编辑
在我的 tableView cellForRowAtIndexPath:
- (UITableViewCell *) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SodTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if(cell == nil){
cell = [[SodTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
if(indexPath.row >= tabledata.count && [self isEditing]){
cell.areaNumber.text = @"new";
}else{
cell.areaNumber.delegate = self;
cell.areaNumber.text = [tabledata objectAtIndex:indexPath.row];
NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
[save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
[save1 synchronize];
NSLog(@"From cell configuration %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}
return cell;
}
我不会谈论如何正确使用UITableView
,我只是告诉你为什么会崩溃。
错误表明您正试图将 nil
对象插入数组。正如我猜测的那样,问题的根源是下面这行。
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
要解决它,请在插入数组之前检查cell.areaNumber.text
。
if(object_areaNumber != nil && cell.areaNumber.text){
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}
已解决
我已经查看了所有关于我对 UITableViews 和相关代码的误解的评论...
如果您查看以下内容 link(到我的 Vimeo 页面),您应该会看到一些漂亮的东西...
我能够在原始问题中加载超过 8 个单元格(如原始问题中所述),甚至能够加载用户可以保存并稍后填写的空行! 一切都保存在 NSUserDefaults 中,可以保存、编辑或删除...
再次感谢您的帮助...当然,与那些仅仅指出我不知道自己在做什么的评论相比,真正对我有帮助的评论总是更受欢迎和更有建设性...
我有一个应用程序可以完成它应该对 UITableView 的前 8 行执行的所有操作...添加第 9 行后(因此 table 视图必须滚动)应用程序崩溃...
我尝试了多种变体,但似乎没有任何效果...我可以根据需要多次向我的行添加单元格,但是一旦我 "fill" [=31] 中的第 9 行=],应用程序崩溃
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
下面是一些代码,用于在 table 视图的行中生成信息(table数据是一个 NSMutable 数组,areaNumber.text 来自一个 customCell )
-(IBAction)save_area:(id)sender {
{
UITableView *tableView = self.myTable;
NSInteger sections = tableView.numberOfSections;
NSMutableArray *cells = [[NSMutableArray alloc] init];
for (int section = 0; section < sections; section++) {
NSInteger rows = [tableView numberOfRowsInSection:section];
for (int row = 0; row < rows; row++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
SodTableCell *cell = [self.myTable cellForRowAtIndexPath:indexPath];//**here, for those cells not in current screen, cell is nil**
[cells addObject:cell];
[tabledata removeObjectAtIndex:indexPath.row];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSObject * object_areaNumber = [prefs objectForKey:@"tablerow_area_input_by_user"];
if(object_areaNumber != nil){
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}
NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
[save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
[save1 synchronize];
NSLog(@"From save button %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}
}
}
}
table 可以在 9 个单元格之外创建一行又一行,如果我想要的话,可以创建数百个,并且滚动有效......当我将信息填充到第 9 行并保存它时使用您在上面看到的代码输入的信息。任何帮助,非常感谢...
编辑
在我的 tableView cellForRowAtIndexPath:
- (UITableViewCell *) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SodTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if(cell == nil){
cell = [[SodTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
if(indexPath.row >= tabledata.count && [self isEditing]){
cell.areaNumber.text = @"new";
}else{
cell.areaNumber.delegate = self;
cell.areaNumber.text = [tabledata objectAtIndex:indexPath.row];
NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
[save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
[save1 synchronize];
NSLog(@"From cell configuration %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}
return cell;
}
我不会谈论如何正确使用UITableView
,我只是告诉你为什么会崩溃。
错误表明您正试图将 nil
对象插入数组。正如我猜测的那样,问题的根源是下面这行。
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
要解决它,请在插入数组之前检查cell.areaNumber.text
。
if(object_areaNumber != nil && cell.areaNumber.text){
[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}
已解决
我已经查看了所有关于我对 UITableViews 和相关代码的误解的评论...
如果您查看以下内容 link(到我的 Vimeo 页面),您应该会看到一些漂亮的东西...
我能够在原始问题中加载超过 8 个单元格(如原始问题中所述),甚至能够加载用户可以保存并稍后填写的空行! 一切都保存在 NSUserDefaults 中,可以保存、编辑或删除...
再次感谢您的帮助...当然,与那些仅仅指出我不知道自己在做什么的评论相比,真正对我有帮助的评论总是更受欢迎和更有建设性...