- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我关于 stackoverflow 的第一个问题 (<< n00b)。我正在处理我的第一个涉及 UITableViews 和 plist 的项目,但我遇到了问题。
属性列表由一个包含 3 个部分/类别(每个一个数组)的字典以及每个部分/类别中的多个条目组成。
列表加载得很好。在我尝试从列表中删除单个条目之前,问题不会发生。
这是我的代码:
- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//make array of the objects and remove the selected object from that array.
NSMutableArray *delArray = [faves objectForKey:[entries objectAtIndex:indexPath.section]];
[delArray removeObjectAtIndex:indexPath.row];
//set entries to the value of the array, now sans the removed object.
self.entries = delArray;
[delArray release];
//write the updated entries to the plist file.
NSArray *rootPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [rootPath objectAtIndex:0];
NSString *plistFile = [docsPath stringByAppendingPathComponent:@"Data.plist"];
[faves writeToFile:plistFile atomically:YES];
//update the actual tableview. This is where things go awry.
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; //ends up trying to load the sections instead of the entries = wrong number of list items returned = crash!
//[tableView reloadData]; //works if I only use this line, but the list updates wrong, showing each entry as a section header.
}
}
条目已从 plist 中正确删除,但表无法正确更新并导致应用程序崩溃。我在下面包含了错误代码。
2011-09-23 18:40:19.732 MyApp[10314:b303] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:974
2011-09-23 18:40:19.734 MyApp[10314:b303] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of sections. The number of sections contained in the table view after the update (5) must be equal to the number of sections contained in the table view before the update (3), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).'
第一个数字 (5) 与受影响的类别中应该保留的记录数一致,但第二个数字 (3) 指的是类别数。正如我上面所说,该条目已从 plist 中删除 - 而不是表。
最佳答案
考虑以下两种方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [entries count];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSString *key = [entries objectAtIndex:section];
NSArray *sectionNames = [faves objectForKey:key];
return [sectionNames count];
}
似乎“entries”是键名 (NSString) 的 NSArray,而“faves”是部分内容 (NSArrays) 的 NSDictionary。
问题是您将键名数组 (self.entries) 替换为单个部分的内容数组。我已经扩展了您的代码以使逻辑错误更加明显:
// query for section key name by section index
NSString * keyName = [entries objectAtIndex:indexPath.section];
// retrieve array of a section's datasource (array of rows)
NSMutableArray * delArray = [faves objectForKey:keyName];
// remove row from a section's datasource
[delArray removeObjectAtIndex:indexPath.row];
// ERROR: assign an array of rows to array used for section names
self.entries = delArray;
将您的代码更改为以下内容应该会删除 UITableView 生成的断言:
(void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//make array of the objects and remove the selected object from that array.
NSMutableArray *delArray = [faves objectForKey:[entries objectAtIndex:indexPath.section]];
[delArray removeObjectAtIndex:indexPath.row];
//write the updated entries to the plist file.
NSArray *rootPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [rootPath objectAtIndex:0];
NSString *plistFile = [docsPath stringByAppendingPathComponent:@"Data.plist"];
[faves writeToFile:plistFile atomically:YES];
//update the actual tableview. This is where things go awry.
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; //ends up trying to load the sections instead of the entries = wrong number of list items returned = crash!
//[tableView reloadData]; //works if I only use this line, but the list updates wrong, showing each entry as a section header.
}
关于iphone - 关于 UITableView 和 deleteRowsAtIndexPaths 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536496/
当我从表中删除行时,我的应用程序崩溃了。这是我检测到错误和堆栈跟踪的来源。谢谢! //delete row from database - (void)tableView:(UITableView *
我对 Swift 和 iOS 比较陌生,我有一个问题 - 我有一个扩展 UITableViewCell 的自定义 SwipeCell 类。这是一个可以左右滑动的单元格,每侧都有按钮。出于某种原因,如果
关于这个问题有几个问题。我已经尝试了所有建议的答案,但还没有任何效果。所以我有这个 func用户收到的拒绝报价。我可以拒绝报价并删除单元格行,但是当只剩下一个单元格时,我得到 fatal error:
我正在尝试借助 deleteRowsAtIndexPaths 折叠和展开 UITableView 部分。似乎什么都没有发生,但我不明白为什么。 NSMutableArray *tmpArray
我正在尝试使用以下代码删除。 [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade
尝试成为 ios7 风格,我在点击表格中的单元格时将 UIPickerView 插入到 UITableView 中。这工作正常并且动画效果很好。但是,当我通过调用 deleteRowsAtIndexP
这个问题在这里已经有了答案: crash on deleteRowsAtIndexPaths (5 个答案) 关闭 7 年前。 我试图在稳定 View 中删除一行,但每次我在应用程序中选择删除时它都
我在IB中设计了UIView,并在其上设计了UITableView。在 View Controller 的 viewDidLoad 方法中,我初始化自定义 UITableViewContoller 并
当我尝试将 deleteRowsAtIndexPaths 与动画 UITableViewRowAnimationTop 一起使用时,我要删除的单元格覆盖了上面的单元格(在动画中),然后消失。我做了一个
当我尝试将 deleteRowsAtIndexPaths 与动画 UITableViewRowAnimationTop 一起使用时,我要删除的单元格覆盖了上面的单元格(在动画中),然后消失。我做了一个
我目前有一个包含多个部分的表格 View 。每个部分包含特定日期的数据。每个部分都有一个标题,说明数据是在多少天前输入的。 当使用deleteRowsAtIndexPath删除行时,当该部分中的所有行
我正在尝试很好地删除 mu UITableView 的单元格: - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITab
我不太确定这里发生了什么,但我遇到了一个我正在使用的联系表。在我的表单中,我添加了向联系人添加电子邮件地址的功能。如下图所示,一旦用户点击“添加电子邮件”,一行就会添加到“电子邮件”部分。 但是,在我
这个问题在这里已经有了答案: crash on deleteRowsAtIndexPaths (5 个答案) 关闭 7 年前。 当我从 tableView 中删除一行时发生崩溃。不确定发生了什么。这
我有一个 UITableView 和一个在后台运行的调度程序,从底层数据对象中删除记录。每次删除对象时,我都希望 TableView 相应地更新。 但是当我尝试从 TableView 中删除一行时,我
我想知道是否有可能捕捉到在 deleteRowsAtIndexPaths 期间触发的动画是否结束?我想要做的是从 UITableView 中删除一些所有行,除了我点击的行。接下来我想在同一个 UITa
我在 Swift、iOS 8、Xcode 6 Beta 6 中从我的 tableView 中删除一行时遇到了一些麻烦。每次我尝试删除一行时,我都会收到类似 的错误 Assertion failure
我有一个可能有几百行的表格,所有行的高度都不同。每当用户删除一行时,调用: [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnim
我有一个动态的 TableView,想用动画删除行。 我的代码: struct TableItem { let text: String let id: String let
我正在尝试从 deleteRowsAtIndexPaths 更新我的 tableView 以使用 animation.fade 。所以请你告诉我如何在我有两个数组时更新 tableView? func
我是一名优秀的程序员,十分优秀!