我很难绕过这个。我正在从plist文件中加载一个NSMutable数组,并用数据填充一个分组表。该表有3个部分,第0部分不可编辑,但另外两个是 - 我有限制工作。我的问题是当用户选择删除两个可编辑部分中的行时。我相信这是因为每个条目都有两个键 - 一个用于它的名字,另一个用于它的URL。
这是我的plist的样本。标题键用于节名称。然后是“行”的键 - 这是在每个单元格中显示的文本,然后是“url”,当选择行时,将在网页视图中加载网址。我知道我想抓取用户选择的部分和行,然后删除该索引的'Row'和'url'。任何帮助将不胜感激。
这是我的plist:
<array>
<dict>
<key>Title</key>
<string>Query</string>
<key>Rows</key>
<array>
<string>Non-editable String 1</string>
<string>Non-editable String 2</string>
<string>Non-editable String 3</string>
<string>Non-editable String 4</string>
</array>
</dict>
<dict>
<key>Title</key>
<string>Resources</string>
<key>Rows</key>
<array>
<string>Website Name 1</string>
<string>Website Name 2</string>
<string>Website Name 3</string>
<string>Website Name 4</string>
<string>Website Name 5</string>
</array>
<key>url</key>
<array>
<string>http://website1.com</string>
<string>http://website2.com</string>
<string>http://website3.com</string>
<string>http://website4.com</string>
<string>http://website5.com</string>
</array>
</dict>
<dict>
<key>Title</key>
<string>Monitoring</string>
<key>Rows</key>
<array>
<string>Website Name 6</string>
<string>Website Name 7</string>
<string>Website Name 8</string>
</array>
<key>url</key>
<array>
<string>http://website6.com</string>
<string>http://website7.com</string>
<string>http://website8.com</string>
</array>
</dict>
这限制了编辑到最后两个部分
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0)
return UITableViewCellEditingStyleNone;
else
return UITableViewCellEditingStyleDelete;
}
这是用于提交删除的(非工作代码)(tableData是我的可变数组的名称)。我的应用程序炸弹:
[[self.tableData objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];
但是猜测deleteRowsAtIndexPaths也是错误的。 代码:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.tableView beginUpdates];
[[self.tableData objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath.row] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
[self.tableView reloadData];
}
的 --- --- UPDATE
如果我这样做并将section和row设置为NSUInteger,当我记录它时,会记录正确的section和row。但是,我正在崩溃
[[self.tableData objectAtIndex:section] removeObjectAtIndex:row];
在我的控制台中,我收到此错误:由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFDictionary removeObjectAtIndex:]:无法识别的选择器发送到实例0x4b43b20'
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSUInteger row = [indexPath row];
NSLog(@"NSUInteger Row: %d", row);
NSUInteger section = [indexPath section];
NSLog(@"NSUInteger Section: %d", section);
[self.tableView beginUpdates];
[[self.tableData objectAtIndex:section] removeObjectAtIndex:row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:section]] withRowAnimation:UITableViewRowAnimationFade];
答案 0 :(得分:1)
对于你的plist,tableData
变量是一个NSMutableArray
,其中包含3个对象,每个对象都是NSMutableDictionary
(尽管事件是docs say it should be an NSDictionary--immutable)。
第二个和第三个词典包含三个键:Title,Rows和url
Rows和url键的值是NSMutableArrays
(尽管文档说它们应该是NSArrays - 不可变)。
无论如何,在阅读plist之后,您想要修改的对象必须以默认的方式或明确地调用mutableCopy
来改变。
在commitEditingStyle
方法中,您需要在数组上调用removeObjectAtIndex
而不是部分字典。因此,首先获取对Rows和url数组的引用(您必须在cellForRowAtIndexPath
中执行类似操作才能显示值)。
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
NSMutableDictionary *sectionDict = [tableData objectAtIndex:indexPath.section];
NSMutableArray *sectionRows = [sectionDict objectForKey:@"Rows"];
NSMutableArray *sectionUrls = [sectionDict objectForKey:@"url"];
[sectionRows removeObjectAtIndex:indexPath.row];
[sectionUrls removeObjectAtIndex:indexPath.row];
//don't need beginUpdates (we're making only one delete call)
//tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
//don't need endUpdates (since we're not doing beginUpdates)
//[tableView endUpdates];
//don't need reloadData since we're calling deleteRowsAtIndexPaths
//(or call reloadData instead of deleteRowsAtIndexPaths)
//[tableView reloadData];
}
}