40

我正在使用 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];

我尝试寻找苹果文档,但没有帮助。

谢谢,阿比

4

4 回答 4

32

当我忘记正确设置数据源出口时,我遇到了这个错误。

如果您看到此错误,请检查您是否明确设置了 TableView 委托和数据源:

  • 转到您的界面构建器并使用“表格视图”查看视图

  • cmd +右键单击从“表格视图”图标拖动(您应该看到一条蓝线)到文件的标题图标,在xcode 6中它旁边有一个黄色图标。

  • 松开鼠标,您应该会看到委托和数据源选项。

  • 选择“数据源”

您的桌子现在应该已正确接线。

于 2015-04-01T16:30:39.240 回答
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];
于 2012-07-29T04:13:38.477 回答
4

我尝试在更新期间打印出 tableView 中实际有多少行和部分,这让我想到,我在 table view 数据源方法中返回了多少部分......这是罪魁祸首:

- (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 方法中向控制台打印以下内容。

-(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){
}

}

知道这次是什么问题吗???谢谢!

于 2013-02-16T05:09:31.490 回答
-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];
于 2016-10-14T02:30:12.920 回答