2011-11-25 62 views
1

我想向UITextView中的UITableViewCell添加一些静态文本。将子视图添加到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,用户仍然无法选择单元格。

回答

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声明或至少引用为表视图控制器类的实例变量可能会很方便。这将帮助您轻松跟踪哪个地址字段被打中并获得正确的indexPath。

1
[addressField setUserInteractionEnabled:NO]; 
1

我希望这可以帮助你一下:根据您的要求

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

,反之亦然。

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的特定子视图。

+0

感谢此代码...我花了2小时思考类似的问题,像原来的职位是关于和你保存我的**这个易于阅读和简单的解决方案:) – d3p0nit

相关问题