我这里有一个棘手的问题。
UITextView
是`UITableViewCell。
UITextView
收到触摸事件,并且tableView: didSelectRowAtIndexPath:
未被调用。
我知道如果我将userInteraction:NO
设置为UITextView,我可以获取tableView的事件。但是,UITextView
的内容为NSAttributedString
,字符串具有NSLinkAttributeName
属性。如果我将userInteraction
设置为false,则无法获得textView:shouldInteractWithURL:inRange:
。
有没有什么好方法可以同时启用这两个事件?
答案 0 :(得分:1)
您可以创建subClass
的{{1}}并添加两个变量
UITextView
将保存节号和行号。使用这些属性,您可以使用@property (nonatomic) NSInteger row;
@property (nonatomic) NSInteger section;
告诉delegation/KVO
选择了(row:x& section:y)中的单元格。
修改强>
此编辑更新自@Daniel Galasko评论。
解决此问题的更好方法是使用方法viewController
,如下所示:
将viewController设置为UITextView的委托,并在dekegate方法中
indexPathForRowAtPoint:
答案 1 :(得分:0)
既然您正在尝试获取单元格,为什么不使用superview?
例如,当您选择textBox时,您可以说类似
- (void)textViewDidBeginEditing:(UITextView *)textView
{
UITableViewCell *cell = (UITableViewCell*)textView.superview.superview;
}
请注意,您需要两次,一次用于内容视图,另一次用于tableview单元格。
以下是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
}
}