ios - XCode iOS7 - 带有 UITextView 的动态单元格(如提醒应用程序)

标签 ios objective-c uitableview ios7

我需要创建一个与内置提醒应用程序具有相同行为的应用程序。创建这个有一些问题:

  • 具有动态高度并随着 UITextView 的内容“增长”的单元格
  • 选择触摸的单元格
  • 当用户编辑内容时刷新单元格的高度(即时)

我已经使用一些技巧解决了动态高度。

剩下的问题是:

如果单元格“完全”包含 UITextView,如何知道用户选择了哪个单元格?

现在我已经使用 textViewDidBeginEditing 方法来了解单元格并将 UITableView 滚动到它:

- (void)textViewDidBeginEditing:(UITextView*)textView
{
    MemoViewCell* cell = (MemoViewCell *)[self parentCellFor:textView];
    if (cell)
    {
        NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
        currentIndexPath = indexPath;
        [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

- (UITableViewCell*)parentCellFor:(UIView*)view
{
    if (!view)
        return nil;
    if ([view isMemberOfClass:[MemoViewCell class]])
        return (UITableViewCell*)view;
    return [self parentCellFor:view.superview];
}

如何在不失去焦点的情况下刷新单元格高度?

为此,我使用了以下方法:

-(void)textViewDidChange:(UITextView *)textView
{
    NSMutableDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:currentIndexPath.row];
    [dataSourceItem setObject:textView.text forKeyedSubscript:@"body"];
    [self.model.dataSource setObject:dataSourceItem atIndexedSubscript:currentIndexPath.row];

    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

当文本更改时,我得到新文本,在模型中更改它,然后调用 beginUpdated 和 endUpdates。

当然,这可行,但一切都非常慢...您是否有一些想法以更优雅的方式实现这一点,也许...高效?

如果我调用 reloadRowsAtIndexPaths:我失去了对单元格的焦点。

最佳答案

首先,如果您在动态高度技巧中使用委托(delegate)方法 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; ,请记住实现此方法沿着 - (CGFloat)tableView:(UITableView *)tableViewestimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;,它在性能方面有很大帮助。

然后,为了专注于您的具体项目,如果我正确理解您的目标,您真正想要的是仅在修改 TextView 时更新 TableView 的布局。目前,您会在每次文本更改时更新它。您可以考虑在 -(void)textViewDidChange:(UITextView *)textView 中使用条件,例如:

if ([textView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height !=
textView.frame.size.height) {
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

仅当您现有的单元格布局尊重 TextView 的固有内容大小时,示例中给出的条件才有效,否则您将需要调整条件。

关于ios - XCode iOS7 - 带有 UITextView 的动态单元格(如提醒应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744228/

相关文章:

iphone - 重写 iOS 应用程序以在 iOS 和 Mac 上运行 - 如何组织 Controller 代码?

objective-c - 在 IOS5 中将表格单元格对齐到底部

swift - 当我向下滚动并返回时,我的数据在 UITableViewCell 中发生变化

iphone - 在 UITableViewController ios 中实现另一个 TableView

iphone - 在 UITableView 中突出显示所选单元格的边框

iphone - iad的banner不需要设置吗?

ios - SuperpoweredAdvancedAudioPlayer 无法在 iOS13 中打开 "ipod-library"路径

ios - CoreML/MLModelConfig 首选MetalDevice - 了解设备放置启发式

objective-c - 覆盖 UIViewController 的 loadView 方法

ios - 如何从 Swift 访问 UIColor 的宏