选择UITeViewView上的UITextView失去调用didSelectRowAtIndexPath委托方法的能力?

时间:2012-05-17 10:26:54

标签: iphone ios uitableview uitextview

我的UITableViewCell选项出现问题。我正在使用带有UITableViewCell子视图的UITextView。在启用用户交互的情况下,UITextView对象不可编辑,不可滚动。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {      
        cell=[[[NSBundle mainBundle]loadNibNamed:@"DemoCell" owner:self options:nil]objectAtIndex:0];         
        cell. accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    }
      if([distanceArray count]){ 
        UILabel *label1=(UILabel*)[cell viewWithTag:1];      
        label1.text=[locationNameArray objectAtIndex:[indexPath section]];
        label1.textColor=[UIColor blueColor];
        UILabel *label2=(UILabel*)[cell viewWithTag:2];        
        [label2 setText:[distanceArray objectAtIndex:[indexPath section]]];
        UITextView *tview=(UITextView*)[cell viewWithTag:3];   
        [tview setText:[discriptionArray objectAtIndex:[indexPath section]]];         
        return cell;
      }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    DetailedLocationVIew *dView=[[DetailedLocationVIew alloc]initWithNibName:@"DetailedLocationVIew" bundle:nil];       
    [self.navigationController pushViewController:dView animated:YES];
    [dView release];
}

如果我选择UITextView上的单元格,则代理didSelectRowIndexPath不会调用。除了UITextView以上的对象和选择工作正常吗? 为什么选择不能在UITextView上工作?

5 个答案:

答案 0 :(得分:11)

使用tview.userInteractionEnabled=NO;,它将解决您的问题。

如果这不能解决你的问题,那就试试吧

for(UIView * cellSubviews in cell.subviews)
{
    cellSubviews.userInteractionEnabled = NO;
}

循环遍历单元格内的所有子视图,并将userInteractionEnabled属性设置为NO

答案 1 :(得分:7)

这些建议在iOS 6中对我不起作用。以下是有效的。

在你的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

添加:

cell.textView.dataDetectorTypes = UIDataDetectorTypeAll;
cell.textView.editable = NO;
cell.textView.userInteractionEnabled = YES;

UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(forwardToDidSelect:)];
cell.tag = indexPath.row;
[cell.textView addGestureRecognizer: tap];

同时:

- (void) forwardToDidSelect: (UITapGestureRecognizer *) tap
{
    [self tableView: self.tableView didSelectRowAtIndexPath: [NSIndexPath indexPathForRow: tap.view.tag inSection: kTextViewCellSection]];
}

设置editable = NO后,似乎需要设置userInteractionEnabled = YES。在XIB中设置这些似乎不起作用。

答案 2 :(得分:2)

因为UITextView确实捕获了触摸事件,所以您可以通过两种方式解决此问题:

1)子类UITextView,捕获触摸事件,然后使用以下方法将其传递给superView的相同方法: 例如:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.superview touchesEnded:touches withEvent:event];
}

2)使用UITextView委托:

- (void)textViewDidBeginEditing:(UITextView *)textView
{
NSIndexPath *a = [NSIndexPath indexPathForRow:0 inSection:[textView tag]];
[tableview didSelectRowAtIndexPath:
}

答案 3 :(得分:0)

在我的情况下,我根据tableViewCell长度调整textView.text的大小,因此我在UIView之上添加了textView并将其颜色设置为0.1%white

答案 4 :(得分:0)

如果只需要禁用一个子视图,可以在Swift中执行以下操作。

theSubTextView.isUserInteractionEnabled = false

这也会禁用isEditable和isSelectable。