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】:
您可以创建UITextView
的subClass
并添加两个变量
@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 中?
UITableViewCell 上的动画按钮而不影响其他 UITableViewCell