gpt4 book ai didi

iphone - 将最后一行移出部分并删除部分时出现奇怪的动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:32:42 24 4
gpt4 key购买 nike

我有一个多部分的表格 View 。在编辑模式下,我允许将行从一个部分移动到另一个部分。从一个部分中删除最后一行后,我将删除该部分。所以我在 moveRowAtIndexPath 中使用 deleteSection。

当最后一项从节中移出时,节标题按计划消失。但是有一个非常奇怪的动画错误,移动的行似乎与它放在上面的行“合并”,并且在“to”部分的底部显示一个空行(可能是因为该部分的 numberOfRows 是正确,但 2 行在同一位置)。更奇怪的是,当我单击该行的重新排序控件(不移动项目,只是触摸并释放)时,这两个项目“取消合并”。

我已经发布了 video证明这一点。

我已尝试在开始/结束更新中包装我的数据更改并查看更改,但无济于事。

我已经上传了一个测试项目here ,我还将在下面发布代码。几点:

  • 我已尝试在演示项目中复制我的数据源格式,以防这是问题的根源。关键是我的源是两个其他数组的复合数组(尽管我不明白为什么这会成为问题)。
  • 要查看有问题的行为,请将底部的两行向上移动到顶部。不过不要将它们放在顶部的最后一行,因为这似乎没问题。
  • 以相反的方式移动行,从顶部到底部,在这个演示项目中是错误的。

代码(所有这些都在演示项目中):

我在 loadView 中设置我的数组:

- (void)loadView{
array1 = [NSMutableArray array];
[array1 addObject:@"test 0"];
[array1 addObject:@"test 1"];
[array1 addObject:@"test 2"];

array2 = [NSMutableArray array];
[array2 addObject:@"test a"];
[array2 addObject:@"test b"];

[super loadView];
}

我还有一个返回这些数组组合的方法 - 这用作数据源:

- (NSMutableArray *)sourceArray{
NSMutableArray *result = [NSMutableArray array];
if (array1.count > 0) {
[result addObject:array1];
}
if (array2.count >0) {
[result addObject:array2];
}
return result;
}

这允许非常简单的行/节数:

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return self.sourceArray.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [[self.sourceArray objectAtIndex:section] count];
}

标准单元格/标题格式:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.textLabel.text = [[self.sourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [NSString stringWithFormat:@"Section %i", section];
}

这就是我施展魔法的地方

    // Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
NSMutableArray *fromArray = [self.sourceArray objectAtIndex:fromIndexPath.section];
NSMutableArray *toArray = [self.sourceArray objectAtIndex:toIndexPath.section];

NSString *movedObject = [[self.sourceArray objectAtIndex:fromIndexPath.section] objectAtIndex:fromIndexPath.row];

[fromArray removeObject:movedObject];
[toArray insertObject:movedObject atIndex:toIndexPath.row];

if ([self.tableView numberOfRowsInSection: fromIndexPath.section] == 0) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:fromIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
}
}

最佳答案

我注意到来自待删除部分的行会消失,直到您润饰订单控件。

我怀疑当 TableView 调用此数据源方法时,它的状态仍处于执行移动的中间,因此调用“deleteSections”将使表尝试删除您正在移动的行。这与其说是合并,不如说是它以与节标题相同的速度消失,而它下面的那个只是快速返回以填充空间。

点击控件会导致 TableView 重新调整自身并意识到该行实际上并没有消失。

要尝试解决这个问题,请尝试通过调度调用在下一个运行循环中运行删除操作,例如:

if ([self.tableView numberOfRowsInSection: fromIndexPath.section] == 0) {
dispatch_async(dispatch_get_main_queue(), ^() {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:fromIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
});
}

这将导致删除仍然在主线程上运行,但允许“moveRow”和它恰好所在的任何调用堆栈在删除调用之前完成其逻辑

关于iphone - 将最后一行移出部分并删除部分时出现奇怪的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953338/

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