2011-10-31 26 views
15

我明白這個問題之前已經被問過了,但是我對答案不滿意,即使它被禁用。有一個根本的區別:禁用視圖不會觸發事件,但對於只讀視圖,它仍應觸發事件(如TouchUpInside),並且我需要它。只有我不想要的是鍵盤輸入。iPhone/iPad:如何使UITextField只讀(但不禁用)?

原因是我有幾個輸入字段,有些可以直接使用UITextField,其他則不可以。我想讓他們看起來很相似。所以,我想用UITextField來顯示它們。其中一些需要只讀,以便我可以使用touch up事件進行替代輸入。

或者可能有完全不同的方式來做到這一點?

編輯:這是我的MonoTouch項目。我對object-c的知識非常有限。

+0

爲所有'不可編輯的'textFields分配一個通用標記值並在'textFieldDidBeginEditing'方法上檢查它並輕鬆返回BOOL是很容易的。 – Gokul

回答

25

假設您有2個文本字段實例變量連接到您在Interface Builder中創建的文本字段。讓我們叫他們myReadOnlyTextFieldmyEditableTextField。確保將Interface Builder中每個文本字段的delegate屬性連接到視圖控制器(「文件所有者」)[1]。現在,在視圖控制器@implementation(.m文件)中,使用方法textFieldShouldBeginEditing:,並放入一些邏輯來確定要允許編輯哪個文本字段,哪些不允許編輯;是這樣的:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    BOOL editable; 
    if (textField == myReadOnlyTextField) { 
     editable = NO; 
    } else if (textField == myEditableTextField) { 
     editable = YES; 
    } else { 
     // editable = YES/NO/Other Logic 
    } 
    return editable; 
} 

UITextFieldDelegate Documentation

textFieldShouldBeginEditing:
問代表是否應編輯在指定文本字段開始 。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

參數
textField - 爲其編輯即將 開始的文本字段。

返回值
YES如果一個編輯會話,應啓動; 否則,NO禁止編輯。

討論
當用戶執行通常會 啓動編輯會話的行爲,該文本字段調用此方法首先 看看編輯實際上應該繼續進行。在大多數情況下, 只會從此方法返回YES以允許編輯繼續。

委託實現此方法是可選的。如果不存在 ,則繼續進行編輯,就好像此方法返回YES一樣。

UITextField Documentation是一個很好的閱讀也。


[1]你可以做到這一點編程爲好。這裏是一個例子:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // ..... 
    myReadOnlyTextField.delegate = self; 
    myEditableTextField.delegate = self; 
} 
+0

非常感謝您的快速響應。對不起,我忘了在我的問題中提到我正在使用MonoTouch項目。從我有限的對象 - 知識,我不明白你在這裏做什麼。其實,如果可能的話,我正在尋找一個簡單的解決方案(如設置屬性)。如果它需要很多代碼才能使其工作,我可能會嘗試找到不同的解決方案。 – newman

+1

十幾行代碼對你來說很重要?順便說一句,你正在設置一個屬性,委託屬性。該代表決定天氣,你可以編輯該字段。 – NJones

+8

@ miliu,沒有冒犯,但這是正確的答案。爲什麼不花時間實施它,也許在學習時學習一些Objective-C? – sosborn

14

儘管事實上你不需要鍵盤,textField:shouldChangeCharactersInRange:replacementString:是非常有用的。它可以防止編輯文本字段,但仍然可以選擇,而不是textFieldShouldBeginEditing:

在MonoTouch的:

var txt = new UITextField(); 
txt.ShouldChangeCharacters += (field, range, replacementString) => false; 
+2

當用自定義視圖(例如日期選擇器)替換輸入視圖(鍵盤)時,這很有用。 – andref

1

,因爲你是在MonoTouch的工作,你可以使用下面的代碼行:

myReadOnlyButton.ShouldBeginEditing = t => 
{ 
    //event code 
    return false; 
}; 
2

你可以有兩種選擇: 一)使用ShouldBeginEditing與回報假,但是你不能在你的文本字段中使用PickerView作爲InputView。 b)使用ShouldChangeCharacters會阻止編輯,但會允許在PickerView中使用InputView。

相關問題