gpt4 book ai didi

ios - 具有分组表问题的 commitEditingStyle

转载 作者:行者123 更新时间:2023-11-29 13:48:59 26 4
gpt4 key购买 nike

我很难理解这个问题。我正在从一个 plist 文件加载一个 NSMutable 数组,并用数据填充一个分组表。该表有 3 个部分,第 0 部分不可编辑,但其他两个是 - 我有这个限制。我的问题是当用户选择删除两个可编辑部分中的一行时。我相信这是因为每个条目都有两个键 - 一个是它的名称,另一个是它的 url。

这是我的 plist 示例。标题键用于部分名称。 Then there's a key for 'Rows' - which is the text that shows in each cell and then 'url' which, when the row is selected, loads the url in a webview.我知道我想获取用户选择的部分和行,然后删除该索引的“行”和“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];
}



---更新---如果我这样做并将部分和行设置为 NSUInteger,当我记录它时,将记录正确的部分和行。但是,我崩溃了

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

最佳答案

对于您的 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];
}
}

关于ios - 具有分组表问题的 commitEditingStyle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com