0

「Done」と呼ばれる6つのUITextFieldsと1つのUIBarButtonItemを含む画面があります。ユーザーが6つのUITextFieldのいずれかに何かを入力したらすぐに、「Done」というUIBarButtonItemを有効にします。また、ユーザーがコンテンツを削除した場合は、「done」というUIBarByttonItemを返してモードを無効にします。iphoneアジェンダに新しい連絡先を追加するときにAppleが適用したのと同じルールを適用したいと思います。情報を入力するとすぐに、[完了]をタップできます。それを賢くする方法はありますか?

マルコス、どうもありがとう。

4

4 に答える 4

5

テキストフィールドが変更されるたびに呼び出されるメソッドを設定する必要があります。これと同じ方法をすべてのテキストフィールドに適用します。このメソッドでは、テキストフィールドにテキストがあるかどうかをチェックします。そのチェックに基づいて、ボタンを有効または無効にします。

// Do this for each text field.
[textField addTarget:self action:@selector(textFieldChangedAction:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldChangedAction:(UITextField *)textField {
    if (textField.text.length) {
        // enable button
    } else {
        // In this method, check every text field for text. If any have text, enable button
        // If none have text, disable button.
    }
}

編集:

すべてのテキストフィールドにインスタンス変数が必要になるため、すべてのテキストフィールドにアクセスして、ボタンを無効にする必要があるかどうかを確認できます。

于 2012-12-07T23:18:29.847 に答える
1

デリゲートメソッド– textField:shouldChangeCharactersInRange:replacementString:を実装し、かどうかを確認します[textfield.text length] > 0。はいの場合は[self.navigationItem.rightBarButtonItem setEnabled:YES];、無効にするために同じことを行いますが、この場合、すべてのテキストフィールドがテキストを取得していないことを確認する必要があります。

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string { 

  NSString *text = [theTextField.text stringByReplacingCharactersInRange:range withString:string];   
  if ([text length] > 0){    
     [self.navigationItem.rightBarButtonItem setEnabled:YES];    
  } else {
//check for all textfields and then set [self.navigationItem.rightBarButtonItem setEnabled:NO]; In place of current textfield, you have to use `text`
  }
  return YES;
}

このアプローチの利点は、6つのテキストフィールドすべてにアクションや通知を追加する必要がないことです。デリゲートはすでに設定されているので、心配する必要はありません。

于 2012-12-07T23:17:13.170 に答える
1

@rmaddyに答えます。textField編集するたびに、そのメソッドが呼び出され、そのSPECIFIC textFieldとのテキストの長さがチェックされますenable or disable barButtonItem。ただし、問題はUIBarButtonItemの有効化または無効化に関するものであり、テキストを含む6つのtextFieldのいずれかでボタンを有効にする必要があります。テキストがない場合は、それだけを無効にする必要があります。textFieldsしたがって、ビュー内ですべてを繰り返す以外にオプションはありません。それぞれのターゲットを書く代わりに、textFieldあなたは使うことができますUITextFieldTextDidChangeNotification

その通知を:methodに追加し、viewWillAppear:methodで削除するだけですviewWillDisappear

このコードを見てください。

-(void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(validateFields) name:UITextFieldTextDidChangeNotification object:nil];

[super viewWillAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

    [super viewWillDisappear:animated];
}

- (void)validateFields {

    // I think you would have outlet for all textFields.So you can check the textfields having text or not ..
     if([textField1.text length] || [textField2.text length] || ....){
           [yourBarButton setEnabled:YES];
      }else{
           [yourBarButton setEnabled:NO];
      }
  }

アップデート:

@rmaddyの回答も機能します。彼の答えの他の部分にコメントを見るのを忘れないでください。今では、1人のユーザーが選択する方法によって異なります。

于 2012-12-08T00:20:25.553 に答える
0

コントローラーMを表示します。

 if (text1.text.length > 0 || text2.text.length > 0 || text3.text.length > 0 || text4.text.length > 0 || text5.text.length > 0 || text6.text.length > 0)  {

    //btnBack is your UIBarButton   
    [btnBack setTitle:@""];
    [btnBack setStyle:UIBarButtonItemStylePlain];
    [btnBack setEnabled:FALSE];
 } else {

     //btnBack is your UIBarButton     
     [btnBack setTitle:@"Done"];
     [btnBack setStyle:UIBarButtonItemStyleBordered];
     [btnBack setEnabled:TRUE];
 }

このコードは、テキストフィールドの長さを検出し、UIBarButtonを有効または無効にします。

于 2012-12-07T23:20:06.510 に答える