UITextView在UITableViewCell上

时间:2015-02-16 10:11:52

标签: ios objective-c uitableview uitextview

我这里有一个棘手的问题。

UITextView是`UITableViewCell。

的子视图

UITextView收到触摸事件,并且tableView: didSelectRowAtIndexPath:未被调用。

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

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

2 个答案:

答案 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
       }
    }