【问题标题】:Change UITableView row height without dismissing keyboard在不关闭键盘的情况下更改 UITableView 行高
【发布时间】:2011-07-17 16:24:18
【问题描述】:

我在 UITableViewCell 中有一个 TextView。 TextView 中的文本可以就地编辑。

TextView 根据文本包含的行数垂直增长和收缩。到目前为止,我还没有找到让包含 TextView 的行动态增长和收缩的可能性。

[tableView reloadData];

[tableView reloadRowsAtIndexPaths: withRowAnimation:];

不工作,因为他们在每次更改时都会关闭键盘。

有没有办法在不关闭键盘的情况下更改 UITableView 中单个行的高度?

【问题讨论】:

    标签: objective-c ios uitableview height row


    【解决方案1】:

    是的,您可以在键入时调整行高。它没有记录在案,而且它违背了原因,但您需要做的就是在 tableView.rowHeight 中设置新值(或让 heightForRowAtIndexPath:ready 计算新高度),然后执行以下操作:

    [tableView beginUpdates]; // updates the row heights ...
    [tableView endUpdates]; // ... nothing needed in between
    

    【讨论】:

    • 是的!惊人的!但是有一个警告:它仅在我将每个编辑事件的当前文本从 TextView 内部保存到在单元格加载时填充 TextView 的变量时才有效。 beginUpdates / endUpdates 似乎没有访问我实际编辑的完全相同的 TextView 对象和文本。
    • 似乎只适用于 iOS >= 4.0,但键盘不会上下弹跳。
    • 耶!谢谢。我花了一段时间才找到正确的 Google 关键字,但您为我省去了很多麻烦。
    • 当您需要在不隐藏键盘的情况下添加/删除一行时,这同样适用。谢谢!
    • 这个解决方案坚持移动tableview
    【解决方案2】:

    任务是在不重用单元格的情况下调用行高重新计算(以保存当前响应者)。

    可以在高度改变后立即调用moveRowAtIndexPath:toIndexPath: 获取相同的indexPath

    - (void)textInputTableView:(UITableView *)tableView cellHeightDidChangeForIndexPath:(NSIndexPath *)indexPath
    {
        [tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
    }
    

    【讨论】:

    • 对我来说很有魅力,应该是公认的答案。
    【解决方案3】:

    在 reloadRowsAtIndexPaths 之后,单元格更改了内存值,因此如果您在 reloadRowsAtIndexPaths 之后调用 becomeFirstResponder,您正在尝试将不存在的旧单元格设置为 firstResponder(becomeFirstResponder 返回 false 并且键盘退出)。

    解决方法是再次调用 cellForRowAtIndexPath 以获取重新加载的单元格的新内存值,然后调用 becomeFirstResponder 到该单元格。

    【讨论】:

    • 好的,谢谢。不幸的是,这仍然无法解决原始问题,因为它会使键盘上下弹跳。对 becomeFirstResponder 的调用,尽管它按你的方式工作,但为时已晚,键盘已经开始消失(由于我假设的 reloadRowsAtIndexPath)。
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2012-09-16
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多