【问题标题】:how prevent cell width from expanding when done editing in UITableView在 UITableView 中完成编辑时如何防止单元格宽度扩大
【发布时间】:2013-08-29 01:51:24
【问题描述】:

如果您在 iPad 联系人应用程序中点击“+”编辑图标以添加新地址时注意到,当图标消失时,单元格不会向左扩展(请参见下面的第一个屏幕截图)。我正在尝试做类似的事情,但没有运气(请参阅下面的第二个屏幕截图)。我尝试使用here 建议的解决方案,但没有奏效。

为了记录,我并没有试图复制实际的联系人应用程序或与联系人集成。我们正在做一些不相关的事情,我的设计师只是想遵循这种模式,所以做一些 POC 工作来看看我能做什么。

编辑-另一个问题,为了验证我的想法,是在联系人应用程序中发生的事情是当点击“+”图标时,此单元格设置为不再编辑,这些文本字段被添加到单元格,标签变了,然后调用了reloadData,对吧?

编辑 - 感谢蒂姆的建议,我快到了!我实际上已经完成了其中的 1/2,但后来遇到了“+”图标没有动画化,只是突然消失的问题。所以我添加了 reloadRows... 调用 commitEditingStyle 但现在整个单元格消失了。这是我的代码:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCellEditingStyle editingStyle = UITableViewCellEditingStyleNone;
    if (self.showEditingIcon) {
        editingStyle = UITableViewCellEditingStyleInsert;
        self.showEditingIcon = NO;
    }
    return editingStyle;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    //    tableView.editing = NO;
    //    tableView.editing = YES;
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

您可以从我注释掉的行中看到我最初的内容,它正在工作,但正如我所说,没有动画 - “+”按钮只是突然消失了。如果我尝试调用 [tableView setEditing:NO animated:YES] 它将不起作用。当我试图将这些调用放在 UIView 动画块中时,它看起来不太好 - 可以看到单元格暂时向左和向后移动。然而,现在随着重新加载调用,单元格完全消失了。目前我没有对我的单元格进行任何更改(例如我没有添加文本字段等),因为我只想让“+”按钮动画出来而不使单元格向左展开工作在第一次迭代中。

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: ios ipad uitableview


    【解决方案1】:

    诀窍是始终处于编辑模式,以使单元格缩进保持不变。加载单元格时,您决定它处于什么状态并返回适当的编辑样式,“插入”样式或“无”:

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL shouldShowInsertButton = ...;//check internal state for cell
        return shouldShowInsertButton ? UITableViewCellEditingStyleInsert : UITableViewCellEditingStyleNone;
    }
    

    然后,当点击编辑按钮时,您会更新内部状态并重新加载单元格:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        ...;//update internal state for cell
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    

    编辑

    这是一个有效的sample project

    【讨论】:

    • 这太棒了 - 我快到了,但我遇到了一些奇怪的事情。当我现在使用下面的代码时,我的整个单元格就消失了。糟糕,要编辑并在我的原始帖子中包含我正在谈论的内容。
    • 非常感谢您!现在检查一下。同时对我的原始帖子进行了编辑。
    • 应该添加我正在使用带有情节提要的静态单元格,因此没有实现 cellForRowAtIndexPath。这是造成问题的原因吗?对于我想要更改单元格的内容(添加文本字段,使其更大等。如在联系人应用程序中)我猜我将不得不改变我的方法?
    • 我确实用静态表格重现了您的单元格消失问题。我从不使用静态表,所以我不是专家。但我确实玩了一下,得出的结论是不支持重新加载行。所以我认为你需要切换到动态单元格。
    • 是的,通过谷歌搜索,我得出了同样的结论。非常感谢所有帮助我解决这个问题的工作!顺便说一句,您是否认为联系人应用程序中的单元格如何更改,这就是他们正在做的 - 在提交编辑时更改内容和 heightForRowAtIndexPath?
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多