2012-07-29 28 views
35

Tôi đang sử dụng UITableViewController và gặp lỗi này trong khi cập nhật tableView. Dưới đây là mã của tôi:NSInternalInconsistencyException ', lý do:' cố gắng chèn hàng 0 vào phần 0, nhưng chỉ có 0 hàng trong phần 0 sau khi cập nhật '

này xảy ra khi tôi làm một sự kiện click:

[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]; 

Tôi đã cố gắng tìm kiếm tài liệu táo nhưng didnt đã giúp.

Xin cảm ơn, Aby

Trả lời

27

Tôi đã gặp sự cố này trước đây. Nó có nghĩa là khi -insertRowsAtIndexPaths:withRowAnimation: được gọi -tableView:numberOfRowsInSection: trở 0. Bạn cần để chèn vào các mô hình trước khi bạn gọi -insertRowsAtIndexPaths:withRowAnimation: (xem: -beginUpdates)


Cập nhật

Tôi tự hỏi những gì giá trị trả về của -tableView:numberOfRowsInSection: là ? Ngoài ra, bạn không cần -beginUpdates/-endUpdates nếu bạn chỉ có một bản cập nhật.

[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]; 
+0

tôi đã làm điều đó .. [timeZoneName insertObject: @ "HELLO" atIndex: 0]; số hàng luôn hơn 1. Tôi vẫn gặp lỗi này .. – insomiac

+0

kiểu trả về của sốOfRowsInSection là [timeZoneNames count]; Bạn có sử dụng insertRowsAtIndexPaths không cần startUpdates và endUpdates không ?? – insomiac

+0

@Aby Từ tài liệu '-beginUpdates':" Gọi phương thức này nếu bạn muốn các thao tác chèn, xóa và chọn tiếp theo (ví dụ: cellForRowAtIndexPath: và indexPathsForVisibleRows) được làm động cùng lúc. " Nó được sử dụng để nhóm nhiều hoạt động UI vào một hoạt động UI đơn lẻ: bạn chỉ có một thao tác. –

4

Tôi đã thử in ra bao nhiêu hàng và phần thực tế trong tableView trong quá trình cập nhật khiến tôi suy nghĩ, có bao nhiêu mục tôi quay lại trong chế độ xem bảng nguồn dữ liệu ... và đây là thủ phạm :

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

Hãy chắc chắn rằng bạn đang trở về 1 và không 0.

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

ít nhất này đã giải quyết được vấn đề đối với tôi ...

CẬP NHẬT:

Tôi gặp vấn đề tương tự một lần nữa sau khi hoạt động được một thời gian. Tôi đã sửa đổi ứng dụng một chút. Quan điểm đầu tiên của tôi là một tableView và khi bạn nhấp vào nút dấu cộng ở phía trên bên phải, bạn sẽ có được một bảng khác, nơi bạn có thể nhập thông tin. Khi bạn nhấp vào thực hiện, thông tin được thêm vào mô hình Core Data với mã này:

- (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]; 

} 

Và tôi khẳng định nó được đưa vào mô hình Core Data thành công bằng cách in ra cửa sổ Console sau trong phương pháp viewDidAppear của tôi khi trở về trở lại màn hình đầu tiên.

-(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]; 

Và sau đó phương pháp addEvent tôi thực hiện điều này:

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

}

Bất kỳ ý tưởng gì vấn đề là thời gian này ??? Cảm ơn!

+0

Bạn không nên đặt 'reloadData' trong khối' beginUpdates'. Hai điều đó là loại trừ lẫn nhau – iwasrobbed

22

Tôi gặp phải lỗi này khi tôi quên đặt đúng nguồn cấp dữ liệu.

Nếu bạn gặp phải lỗi này, kiểm tra xem bạn có rõ ràng thiết lập đại biểu TableView của bạn và nguồn dữ liệu:

  • đi để xây dựng giao diện của bạn và nhìn vào quan điểm với 'Bảng View'

  • cmd + click chuột phải kéo (bạn sẽ thấy một dòng màu xanh) từ biểu tượng 'Bảng Xem' vào biểu tượng tiêu đề cho tệp, biểu tượng này có biểu tượng màu vàng bên cạnh nó trong xcode 6.

  • nhả chuột, bạn nên xem đại biểu và da tùy chọn tasource.

  • chọn 'nguồn dữ liệu'

bảng của bạn bây giờ sẽ được dây một cách chính xác.

+3

giải quyết nó cho tôi –

+0

cách này là chính xác cho tôi. Chỉ cần làm dây giữa nguồn dữ liệu và Bảng !!!!. Và giữa đại biểu và Bảng !!!. Không xem bộ điều khiển. Nhưng với Bảng. –

0

Kiểm tra điều này "cố gắng chèn hàng 0 vào phần 0, nhưng chỉ có 0 hàng trong phần 0 sau khi cập nhật".

Nó sẽ xuất hiện khi bạn chèn đối tượng vào hàng 0, phần 0, không có phần nào. Cố gắng chèn phần trước khi bạn chèn hàng.

[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]; 
Các vấn đề liên quan