2011-10-31 17 views
15

私はこの質問がこれまでに聞かれてきたことを理解していますが、回答に満足していない、つまり無効にしています。無効なビューではイベントは発生しませんが、読み取り専用のビューでも(たとえばTouchUpInsideなどの)イベントが発生する必要があり、必要とします。私が望まないのは、キーボード入力だけです。iPhone/iPad:UITextFieldを読み取り専用にするにはどうすればいいですか?

私はいくつかの入力フィールドを持っている、いくつかは直接UITextFieldを使用することができますが、他はありません。私はそれらを似たように見せたい。だから、私はそれらのすべてを表示するためにUITextFieldを使用したいと思います。それらのうちのいくつかは読み込み専用でなければならないので、代替入力のためにタッチアップイベントを使用することができます。

これとは全く異なる方法がありますか?

編集:これは私のMonoTouchプロジェクト用です。私はオブジェクトCについて非常に限られた知識しか持っていません。

+0

すべての '編集不可能な'テキストフィールドに共通のタグ値を割り当て、 'textFieldDidBeginEditing'メソッドでチェックしてBOOLを適切に返すのは簡単です。 – Gokul

答えて

25

Interface Builderで作成したテキストフィールドに2つのテキストフィールドインスタンス変数が接続されているとします。それらをmyReadOnlyTextFieldmyEditableTextFieldと呼ぶことができます。 Interface Builderの各テキストフィールドのdelegateプロパティをView Controller( "File's Owner")[1]に接続してください。ビューコントローラ@implementation(.mファイル)では、メソッドtextFieldShouldBeginEditing:を使用して、編集を許可するテキストフィールドと編集を許可しないテキストフィールドを決定するロジックを入力します。 UITextFieldDelegate Documentationから

- (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; 
} 

:このような何か

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、違反はありませんが、これは正解です。なぜそれを実装するための時間を取って、それをやっている間に何らかの客観的なことを学ぶのはなぜですか? – sosborn

14

あなたは何のキーボードを必要としないという事実にもかかわらず、textField:shouldChangeCharactersInRange:replacementString:は非常に便利です。テキストフィールドの編集を防ぎますが、textFieldShouldBeginEditing:とは対照的に、テキストフィールドを選択可能なままにします。 MonoTouchでは

: a)のリターンでShouldBeginEditingを使用する:あなたは二つの選択肢を持つことができます

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

入力ビュー(キーボード)をカスタムビュー(日付ピッカーなど)で置き換えるときに便利です。 – andref

1

あなたはMonoTouchでで作業しているので、あなたは、次のコード行を使用することができますfalseですが、テキストフィールドでは、PickerViewをInputViewとして使用することはできません。 b)編集を妨げるShouldChangeCharactersを使用するが、PickerViewでInputViewを使用できるようにする。

2

var txt = new UITextField(); 
txt.ShouldChangeCharacters += (field, range, replacementString) => false; 
関連する問題