将子视图添加到UITableViewCell的内容视图会使单元格无法选择

时间:2011-11-25 08:23:59

标签: objective-c ios cocoa-touch uitableview

我想在UITextView中向UITableViewCell添加一些静态文本。

UITextView *addressField = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 300, 75)];
[addressField setBackgroundColor:[UIColor clearColor]];
[addressField setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]];
[addressField setContentInset:UIEdgeInsetsMake(0, 20, 0, 0)];
[addressField setEditable:NO];
[addressField setScrollEnabled:NO];

// change me later
[addressField setText:@"John Doe\n555 Some Street\nSan Francisco, CA, 00000"];

[cell.contentView addSubview:addressField];

[addressField release];

这很好用,但是这个代码使得单元格无法选择,可能是因为UITextView覆盖了整个单元格。

如何解决这个问题,以便我可以同时拥有UITextView和可选择的单元格?

顺便说一句,我可以让UITextView的大小更小一些,但是如果他们触摸UITextView,用户仍然无法选择单元格。

4 个答案:

答案 0 :(得分:2)

我认为稍微好一点的方法是在整个桌子上创建一个轻击手势识别器。 (例如在viewDidLoad中)

// gesture recognizer to make the entire cell a touch target
UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] 
                             initWithTarget:self action:@selector(changeFocus:)];
[tableView addGestureRecognizer:tap];
[tap release];

然后创建一个选择器(在这种情况下为changeFocus:)进行实际选择。

- (void)changeFocus:(UITapGestureRecognizer *)tap
{
  if (tap.state == UIGestureRecognizerStateEnded)
  {
    CGPoint tapLocation = [tap locationInView:self.tableView];
    NSIndexPath* path = [self.tableView indexPathForRowAtPoint:tapLocation];
    [self tableView:self.tableView didSelectRowAtIndexPath:path];
  }
}

您可以使changeFocus方法更精细,以防止选择或将焦点放在所选indexPath的特定子视图上。

答案 1 :(得分:1)

[addressField setUserInteractionEnabled:NO];

答案 2 :(得分:1)

我希望这会对你有所帮助:

[self.view insertSubview:TextView aboveSubview:TableView];

反之亦然,基于您的要求。

答案 3 :(得分:1)

我会采用以下方法,以便与UITextView和UITableViewCell保持交互。

  • 将您的控制器类(我猜是UITableViewController?)声明为UITexView委托。
  • 声明UITextView时,请将表视图控制器设置为委托。
  • 在表视图控制器.m文件中实现一个UITextViewDelegate方法(例如: - (void)textViewDidChangeSelection:(UITextView *)textView)。
  • 在此方法中,您可以使用自定义代码或通过触发tableView :( UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)委托方法通过selectRowAtIndexPath:animated:scrollPosition:。
  • 来操作目标单元格。

您的代码可能如下所示:

在表视图控制器.h文件中:

@interface MyTableViewController : UITableViewController <UITextViewDelegate> { ...
...
}

在表视图控制器.m文件中:

UITextView *addressField = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 300, 75)];
[addressField setDelegate:self];
...

然后实现此函数(或任何其他合适的UITextViewDelegate函数):

- (void)textViewDidChangeSelection:(UITextView *)textView {

    // Determine which text view triggered this method in order to target the right cell
    ...
    // You should have obtained an indexPath here
    ...
    // Call the following function to trigger the row selection table view  delegate method
    [self.tableView selectRowAtIndexPath:indexPath animated:YES    scrollPosition:UITableViewScrollPositionNone]

}

请注意,还有其他替代方法,如子类化UITextView并处理它的触摸方法。我建议使用其代表协议提供的可能性。

另请注意,将UITextView声明或至少引用为表视图控制器类的实例变量可能很方便。这将帮助您轻松跟踪命中的addressField并获得正确的indexPath。