UITableViewCell 上的 UITextView

Posted

技术标签:

【中文标题】UITableViewCell 上的 UITextView【英文标题】:UITextView on UITableViewCell 【发布时间】:2015-02-16 10:11:51 【问题描述】:

我有一个棘手的问题。

UITextView 是 `UITableViewCell 的子视图。

UITextView 接收到触摸事件并且tableView: didSelectRowAtIndexPath: 没有被调用。

如果我将userInteraction:NO 设置为 UITextView,我知道我可以获得 tableView 的事件。但是,UITextView 的内容是NSAttributedString,并且字符串具有NSLinkAttributeName 属性。如果我将userInteraction 设置为false,我将无法获取textView:shouldInteractWithURL:inRange:

有什么好的方法可以同时启用这两个事件吗?

【问题讨论】:

将您的UITextView 属性editable 设置为FALSE 并将其userInteraction 设置为TRUE? 这个tableView有section吗?还是全部集中在一个部分? @Larme UITextView 在我的情况下不应该是 editable @YuviGr 如果有数据,我有 3~5 个部分。 简而言之,没有。文本字段是用户触摸的响应者,因此会使 tableView 无效。如果您也依赖其中的代码,为什么不能自己简单地调用 didSelectRowAtIndexPath? 【参考方案1】:

您可以创建UITextViewsubClass 并添加两个变量

@property (nonatomic) NSInteger row;
@property (nonatomic) NSInteger section;

这将包含节号和行号。使用这些属性,您可以使用delegation/KVO 告诉viewController,选择了 (row:x & section:y) 中的单元格。

编辑

此编辑更新自@Daniel Galasko 评论。

解决这个问题的更好方法是使用indexPathForRowAtPoint: 方法,如下所示:

将 viewController 设置为 UITextView 的委托,并在 dekegate 方法中

- (void)textViewDidBeginEditing:(UITextView *)textView

   CGPoint position = [textView convertPoint:CGPointZero toView: <yourtableView> ];
   NSIndexPath *indexPath = [<your tableView> indexPathForRowAtPoint: position];
 

【讨论】:

太傻了,想象一下你在一个单元格中有多个不同的视图。您必须为每个视图执行此操作。为什么不使用 indexPathForRowAtPoint 方法... 你会在哪里使用这个方法?! 在此处查看我的答案***.com/questions/9577392/… 拥有 textView 后,假设您还可以访问表格视图,则可以轻松获取其索引路径 是的,我可以看到它是如何工作的,谢谢我更新答案【参考方案2】:

既然你想获取一个单元格,为什么不让用户超级查看?

例如,当你选择你的文本框时,你可以说类似

- (void)textViewDidBeginEditing:(UITextView *)textView

   UITableViewCell *cell = (UITableViewCell*)textView.superview.superview;

请注意,您需要两次,一次用于内容视图,下一次用于表格视图单元格。

这是 UITableView 层次结构的参考: http://www.curiousfind.com/blog/646

另外,在处理 ios8 时要小心,因为我认为它们添加了额外的层。因此,您可以执行以下操作:

-(UITableViewCell*)getCellForTextView:(UIView*)searchForView

    if(search isKindOfClass:[UITableViewCell class])
        return search;
    
    if(!search)
       return NULL;
    return [self getCellForTextView:search.superview];

在你的功能中你可以做到:

- (void)textViewDidBeginEditing:(UITextView *)textView
    
       UITableViewCell *cell = [self getCellForTextView:textView];
       if(cell) 
       
          //do stuff
       
       else 
       
            //it is null! handle this somehow
       
    

【讨论】:

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

从 UIText 字段的用户输入更改 UIView 框架的高度和宽度

禁用 UILabel、UIText 等的自动调整字体。在 iOS/Swift 中?

无法更改 UIText 视图的字体(使用 Web 服务时)

UITableViewCell 上的动画按钮而不影响其他 UITableViewCell

uitableviewcell 上的 mpmovieplayercontroller 视图

UITableViewCell 上的动画