UITableView 内的 UITextView

Posted

技术标签:

【中文标题】UITableView 内的 UITextView【英文标题】:UITextView inside UITableView 【发布时间】:2011-05-13 20:58:52 【问题描述】:

我知道以前有人问过这个问题,但我似乎找不到我想要的。我的应用程序中有一个部分,其中有一个 tableview,里面有一个 textview。我不想为 tableview 单元格设置单独的 .xib、.h 和 .m 文件。 tableview 不需要根据 textview 内的文本量来缩小或增长。我也不希望 textview 是可编辑的。我希望这不是太多要求,尽管我现在真的被困住了。

【问题讨论】:

【参考方案1】:

为此,您需要在 UITableViewCell 中嵌入一个。但无需创建自定义单元格。以下是您想要做的基本想法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UITextView *comment = [[UITextView alloc] initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, tableView.rowHeight)];
        comment.editable = NO;
        comment.delegate = self;
        [cell.contentView addSubview:comment];
        [comment release];
    
    return cell;

如果您不想要单元格附带的标准 44pt 高度,您当然需要设置 rowHeight。如果您想要实际的单元格,则需要添加自己的逻辑,以便只有您想要的单元格是 textView,但这是基本思想。其余的由您根据您的配件进行定制。希望这会有所帮助

编辑:绕过 textView 进入您的单元格,有两种方法可以解决此问题。

1) 你可以制作一个自定义的 textView 类并覆盖 touchesBegan 以将消息发送给 super:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    [super touchesBegan:touches withEvent:event];

这会将触摸事件发送到它的超级视图,也就是您的 tableView。考虑到您不想制作自定义 UITableViewCells,我想您可能也不想制作自定义 textView 类。这导致我选择第二个选项。

2) 创建 textView 时,删除comment.editable = NO;。我们需要让它保持可编辑状态,但会在委托方法中解决这个问题。

在您的代码中,您需要插入一个 textView 委托方法,我们将从那里完成所有工作:

编辑:更改此代码以与 UITableViewController 一起使用

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView 
// this method is called every time you touch in the textView, provided it's editable;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:textView.superview.superview];
    // i know that looks a bit obscure, but calling superview the first time finds the contentView of your cell;
    //  calling it the second time returns the cell it's held in, which we can retrieve an index path from;

    // this is the edited part;
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    // this programmatically selects the cell you've called behind the textView;


    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    // this selects the cell under the textView;
    return NO;  // specifies you don't want to edit the textView;

如果这不是您想要的,请告诉我,我们会帮您解决

【讨论】:

在调用 cellForRowAtIndexPath 时,这不会总是添加子视图吗?不应该在 if(cell == nil) 条件块中添加 UITextView 吗? 这样每次都会加一个,是的。将它添加到 if(cell == nil) 块中会更好。我为此道歉。我在我的一个应用程序中以案例形式使用它,每次调用它以更新单元格的位置并提供新标签时,我将单元格设置为 nil。我以为我记得为您将其修改回正常状态,但错过了那部分,所以我很高兴您抓住了它。我现在将其编辑到正确的位置 哈哈,我也犯了同样的罪 :) 当我的 tableview 像蜗牛一样滚动时,我学到了很多困难,我不知道为什么......干杯! 小事总是让你感动,哈哈。不过,再次感谢您的好收获。我非常感谢它 没问题。我很高兴一切正常,非常欢迎您 =]

以上是关于UITableView 内的 UITextView的主要内容,如果未能解决你的问题,请参考以下文章

当 UITextView 的文本超出 1 行时展开 UITextView 和 UITableView

如何将 UITextView 添加到 UITableView 详细信息

通过 UITextView 内容大小调整 UITableView 单元格的大小

将 UITextView 放在 UITableView 页脚中

UITableview swift中的UITextview高度

如何在 swift 中从 uitableview 转到 uitextview 并使用 nsattributedtext 属性