我正在使用UITableViewController并在更新tableView时收到此错误。以下是我的代码:
当我执行点击事件时会发生这种情况:
[timeZoneNames insertObject:@"HELLO" atIndex:0];
[self.tableView beginUpdates];
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];
我试图寻找苹果文档,但这没有帮助。
谢谢, ABY
答案 0 :(得分:30)
当我忘记正确设置数据源插座时,我遇到了这个错误。
如果您看到此错误,请检查您是否已显式设置TableView委托和数据源:
转到您的界面构建工具,然后使用'表视图'
cmd +右键拖动(您应该看到一条蓝线)来自“表格视图”'图标到文件的标题图标,xcode 6旁边有一个黄色图标。
释放鼠标,您应该看到委托和数据源选项。
选择'数据源'
现在应该正确连接你的桌子。
答案 1 :(得分:28)
之前我遇到过这个问题。这意味着当调用-insertRowsAtIndexPaths:withRowAnimation:
时-tableView:numberOfRowsInSection:
返回0.您需要在调用-insertRowsAtIndexPaths:withRowAnimation:
之前插入模型(请参阅:-beginUpdates
)
<强>更新强>
我想知道-tableView:numberOfRowsInSection:
的返回值是多少?此外,如果您只有一次更新,则不需要-beginUpdates
/ -endUpdates
。
[timeZoneNames insertObject:@"HELLO" atIndex:0];
// Let's see what the tableView claims is the the number of rows.
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]);
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];
答案 2 :(得分:4)
我尝试在更新期间打印出tableView中实际有多少行和部分让我思考,我在表视图数据源方法中返回了多少部分......这就是罪魁祸首:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 0;
}
确保您返回1而不是0。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
至少这解决了我的问题...
<强>更新强>
我工作了一段时间之后又遇到了同样的问题。我有点修改了应用程序。我的第一个视图是tableView,当您单击右上角的加号按钮时,您将获得另一个可以输入信息的表。单击“完成”后,信息将使用以下代码添加到Core Data模型中:
- (IBAction)doneButtonPressed:(UIBarButtonItem *)sender
{
MoneyBadgeAppDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context =
[appDelegate managedObjectContext];
NSManagedObject *newMoment;
newMoment = [NSEntityDescription
insertNewObjectForEntityForName:@"SpendingMoment"
inManagedObjectContext:context];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *modifiedDate = [dateFormat dateFromString: self.dateTextField.text];
[newMoment setValue: modifiedDate forKey:@"date"];
[newMoment setValue: descTextField.text forKey:@"desc"];
[appDelegate.eventsArray insertObject:newMoment atIndex:0];
NSError *error;
[context save:&error];
[self dismissViewControllerAnimated:YES completion:nil];
}
我确认通过在返回第一个屏幕后的viewDidAppear方法中将以下内容打印到控制台,成功进入Core Data模型。
-(void)viewDidAppear:(BOOL)animated{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SpendingMoment"
inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *items = [self.managedObjectContext
executeFetchRequest:fetchRequest error:&error];
for (SpendingMoment *moment in items) {
NSLog(@"Date: %@, Desc: %@", [moment date], [moment desc]);
}
[self addEvent];
然后我的addEvent方法执行此操作:
- (void)addEvent {
[self.tableScreen beginUpdates];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableScreen insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[self.tableScreen reloadData];
[self.tableScreen endUpdates];
@try{
[self.tableScreen scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
@catch(NSException *exception){
}
}
知道这次问题是什么???谢谢!
答案 3 :(得分:-1)
检查“尝试将第0行插入第0部分,但更新后第0部分只有0行”。
当您在第0行第0部分中插入对象时,它没有任何部分。 在插入行之前尝试插入部分。
[timeZoneNames insertObject:@"HELLO" atIndex:0];
NSLog(@"sections: %lu ",[self.downlaodTableView numberOfSections];
// insert section
[self.tableView insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)] withRowAnimation:UITableViewRowAnimationNone];
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]);
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop];