2011-11-25 61 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

相關問題