XCode iOS7 - 带有UITextView的动态单元,如Reminder App

时间:2015-01-02 15:10:07

标签: ios objective-c uitableview ios7

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

  • 具有动态高度且“增长”为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:我失去了对单元格的关注。

1 个答案:

答案 0 :(得分:2)

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

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

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

仅当您的现有单元格布局遵循文本视图的内在内容大小时,作为示例给出的条件才有效,否则您将需要调整条件。