13

ユーザーが少なくとも 1 つの文字を uitextfield に書き込んだときに、(モーダル ビューで) ナビゲーション バーの [完了] ボタンを有効にしたいと思います。私は試した:

  • textFieldDidEndEditing: 前の uitextfield がファーストレスポンダーを辞任したときにボタンを有効にします (したがって、現在の uitextfield にゼロ文字があるため)。
  • textFieldShouldBeginEditing: テキストフィールドがファーストレスポンダになると呼び出されます。これを行う別の方法はありますか?

[編集]

解決策は

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

でもどちらでもない

 [self.navigationItem.rightBarButtonItem setEnabled:YES];

また

[doneButton setEnabled:YES]; //doneButton is an IBOutlet tied to my Done UIBarButtonItem in IB

仕事。

4

7 に答える 7

32

正しいコードは次のとおりです。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger length = editingTextField.text.length - range.length + string.length;
    if (length > 0) {
        yourButton.enabled = YES;
    } else { 
        yourButton.enabled = NO;
    }
    return YES;
}

編集: 以前の MasterBeta と後で David Lari によって正しく指摘されたように、イベントは Editing Changed に応答する必要があります。これは正しいとマークされたものであるため、David Lariのソリューションで回答を更新しています。

- (IBAction)editingChanged:(UITextField *)textField
{
   //if text field is empty, disable the button
    _myButton.enabled = textField.text.length > 0;
}
于 2011-10-21T14:21:29.573 に答える
18

ただしshouldChangeCharactersInRange、ユーザーがテキストフィールドコントロールのクリアボタンを押しても呼び出されません。また、テキストフィールドが空の場合は、ボタンも無効にする必要があります。

Aは、テキストフィールドコントロールのEditingChangedIBActionイベントに接続できます。また、ユーザーがクリアボタンを入力または押すと呼び出されます。

- (IBAction) editDidChanged: (id) sender {
    if (((UITextField*)sender).text.length > 0) {
        [yourButton setEnabled:YES];
    } else {
        [yourButton setEnabled:NO];
    }
}
于 2012-03-19T06:24:06.527 に答える
3

@MasterBeta: ほぼ正しい。彼の指示に従って、アクションをEditing Changedに接続しますが、このコードはより単純でタイプミスがありません。

- (IBAction)editingChanged:(UITextField *)textField
{
   //if text field is empty, disable the button
    _myButton.enabled = textField.text.length > 0;

}
于 2013-10-08T15:35:02.867 に答える
1

実際、Xcode 6.x では、ON Auto-enable Return Key でフラグを立てるのに十分です。

于 2015-03-05T18:57:42.873 に答える
0

この回答は、すべてのシナリオで機能しているようです。1文字、クリア、全変化。誰かがこれが役立つことを願っています。

于 2014-07-17T22:46:56.727 に答える
0

スイフト 2.2

次のように、カスタム メソッド「checkTextField()」を「myTextField」UITextField に割り当てることができます。

myTextField.addTarget(self, action: #selector(self.checkTextField(_:)), forControlEvents: .EditingChanged);

メソッド内の完了ボタンを次のように切り替えます。

func checkTextField(sender: UITextField) {

    doneButton.enabled = !sender.hasText();
}

代理人は必要ありません。

于 2016-07-12T09:43:43.263 に答える
-2

試してみてください:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int lenght = editingTextField.text.length - range.length + string.length;
if (lenght > 0) {
    yourButton.enabled = YES;
} else { 
    yourButton.enabled = NO;
}
return YES;

}

この回答は、以下の「w4nderlust」によって実際により良い解決策が存在したときに正しいとマークされました。この答えは彼らのものです。

于 2011-02-25T14:52:10.563 に答える