2011-06-30 105 views
2

我有兩個視圖 - 一個是我的iphone應用程序中的表視圖和其他詳細視圖。當選中表中的一行時,將顯示詳細視圖。iPhone:如何使UITextField,UITextView在切換視圖時不可編輯

我使用筆尖編輯記錄,添加新記錄以及顯示記錄的詳細視圖。詳細視圖有一個UITextField和一個UITextView,當我只顯示記錄時,它需要被設置爲不可編輯。在桌面的didSelectRowAtIndexPath方法我試過這...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Navigation logic may go here. Create and push another view controller. 
    MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil]; 

    memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath]; 

// making the text field and text view uneditable - DID NOT WORK??? 
     memoDetailViewController.memoTitleText.enabled = NO; 
     memoDetailViewController.memoTextView.editable = NO; 

    // Pass the selected object to the new view controller. 
    [self.navigationController pushViewController:memoDetailViewController animated:YES]; 
    [memoDetailViewController release]; 
} 

這是行不通的。 textfield和uitextview保持可編輯 - 當我點擊它們時,鍵盤會出現。我在這裏錯過了什麼?

回答

7

可能最簡單的方法是使用它們各自的委託方法。他們是一樣的,只有不同的名字。使用UITextField作爲一個例子,你是基本的做法是這個

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    if (someCaseWhereYouWantToEdit) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

這讓當你要讓它繼續編輯您指定。當然,你需要有文本框和TextView的實例與self作爲他們的代表設置以及進口代理協議,在頭

+0

這需要進入詳細視圖或表視圖?我問,因爲我需要控制從表格視圖內的可編輯行爲 - 當選擇一行... – vikmalhotra

+0

這取決於你如何設置。如果你正在使用一個包含tableView的視圖控制器,它將會進入實現文件。如果你使用的是tableViewController,它會進入該實現文件。每次你點擊一個textField(和其相應的方法都是類似的textView)時,這個方法會被調用,所以你可以添加你想要的任何邏輯,讓它知道什麼時候繼續編輯(返回YES),或者它應該是什麼時候僅用於顯示(返回NO) – justin

0

在認爲應該是不可編輯視圖控制器試試這個:

-(void)viewWillAppear:(BOOL)animated { 
    memoDetailViewController.memoTextView.editable = NO; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    memoDetailViewController.memoTextView.editable = YES; 
} 
1

代碼不起作用,因爲該視圖尚未從XIB加載,因此這些屬性爲nil,並且發送至nil的效果爲零。如果你改變了以pushViewController第一那麼它應該工作

MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil]; 

memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath]; 

[self.navigationController pushViewController:memoDetailViewController animated:YES]; 

memoDetailViewController.memoTitleText.enabled = NO; 
memoDetailViewController.memoTextView.editable = NO; 

[memoDetailViewController release]; 

雖然這個作品,我會建議聲明BOOL屬性。將其設置爲YESNO,然後使用其值viewWillAppear:方法啓用或禁用字段。

4

你甚至可以禁止用戶交互的特別XIB UI元素來啓用

+1

正確,但是從內存中,這樣做會修改組件的外觀。我習慣這樣做,因爲這樣用戶知道該字段乍一看不可編輯,但它可能不是期望的行爲。 (例如:如果你想彈出一個模式視圖,將填補這個領域,而不是彈出鍵盤,讓用戶認爲該字段被禁用不一定是個好主意。) – psycho

0

您也可在不同-2同時使用這兩種視圖控制器

-(void)viewDidAppear:(BOOL)animated 
{ 
    memoDetailViewController.memoTextView.editable = NO; 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
    memoDetailViewController.memoTextView.editable = YES; 
} 
0

你應該試試這個:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 

} 
相關問題