gpt4 book ai didi

ios - 在 tableView 中插入和删除行时,如何防止它尝试将它们添加到无效位置?

转载 作者:行者123 更新时间:2023-11-29 03:42:58 25 4
gpt4 key购买 nike

假设我有一个 tableView 部分,其中只有 2 个单元格:用户名和密码。如果我点击这些单元格中的任何一个,我想在它们的正下方添加另一个单元格(包含有效用户名的信息等)。只有一个详细单元格应该立即可见,因此如果用户名打开并且我点击密码,用户名一将被删除,密码一将被添加。

我遇到一个问题,如果用户名打开,然后我点击密码,应用程序就会崩溃。它试图在indexPath.row 3处插入一个单元格(因为当时用户名是0,用户名详细信息是1,密码是2。但是,刚刚发生了删除,到那时用户名详细信息就消失了,因此它尝试在 3 处插入,而实际上应该在 2 处插入。

我在这里能做什么?对于如此简单的操作来说,整个单元格更新的事情似乎异常复杂。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *indexPathToDelete = self.controlRowIndexPath;

if ([indexPath isEqual:self.tappedIndexPath]) {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
self.tappedIndexPath = nil;
self.controlRowIndexPath = nil;

if (indexPath.section == 0) self.cellDetailOpenInSection0 = NO;
else if (indexPath.section == 1) self.cellDetailOpenInSection1 = NO;
else self.cellDetailOpenInSection2 = NO;

} else {
self.tappedIndexPath = indexPath;
self.controlRowIndexPath = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section];

if (indexPath.section == 0) self.cellDetailOpenInSection0 = YES;
else if (indexPath.section == 1) self.cellDetailOpenInSection1 = YES;
else self.cellDetailOpenInSection2 = YES;
}

[self.userPassTableView beginUpdates];

if (indexPathToDelete) {
[self.userPassTableView deleteRowsAtIndexPaths:@[indexPathToDelete] withRowAnimation:UITableViewRowAnimationAutomatic];
if (indexPathToDelete.section == 0) self.cellDetailOpenInSection0 = NO;
else if (indexPathToDelete.section == 1) self.cellDetailOpenInSection1 = NO;
else if (indexPathToDelete.section == 2) self.cellDetailOpenInSection2 = NO;
}

if (self.controlRowIndexPath) {
[self.userPassTableView insertRowsAtIndexPaths:@[self.controlRowIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
if (self.controlRowIndexPath.section == 0) self.cellDetailOpenInSection0 = YES;
else if (self.controlRowIndexPath.section == 1) self.cellDetailOpenInSection1 = YES;
else if (self.controlRowIndexPath.section == 2) self.cellDetailOpenInSection2 = YES;
}

// Trying to insert one at a location that no longer exists because it just deleted one.

[self.userPassTableView endUpdates];

}

最佳答案

好吧,如果只有两个单元格,则无需使其变得过于复杂。我要做的是使用 heightForRowAtIndexPath: 和开始/结束更新来为我完成繁重的工作。

首先,设置每个单元格以在上半部分显示用户名/密码标签/文本字段/任何您想要的内容,并在下半部分显示“详细信息”。

enter image description here

然后只需修改 heightForRowAtIndexPath: 即可默认返回一个仅显示单元格上半部分的值,并且仅在有条件的情况下足够大以显示整个单元格。从这里开始,您所要做的就是进行一点索引路径比较,然后您就成功了。

- (void)viewDidLoad
{
[super viewDidLoad];
self.currentIndexPath = [NSIndexPath indexPathForRow:NSIntegerMax inSection:0];
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([indexPath compare:self.currentIndexPath] == NSOrderedSame) {
return 100.0f;
}
return 44.0f;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.tableView beginUpdates];

if ([indexPath compare:self.currentIndexPath] == NSOrderedSame) {
self.currentIndexPath = [NSIndexPath indexPathForRow:NSIntegerMax inSection:0];
}else{
self.currentIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
}

[self.tableView endUpdates];
}

关于ios - 在 tableView 中插入和删除行时,如何防止它尝试将它们添加到无效位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144633/

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