30

How can I change the return key on the iPhone while it is editing. I know about

myTextField.returnKeyType = UIReturnKeySearch;

However, this only works if I call [myTextField resignFirstResponder]; then [myTextField becomeFirstResponder]; which hides the keyboard then brings it back. Otherwise, it just stays as the one I had before, in this case it was "Go". I need to keep switching them depending on the characters the user enters.


In one line: How do I change the return key type of the keyboard while it is still editing?

4

8 に答える 8

6

しばらく前に見つけたので、ここに投稿するのを忘れていました。私は使っている:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: 
(NSRange)range replacementString:(NSString *)string {
    [self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1];
    return YES;
}

-(void)addressBarTextDidChange:(NSString *)text {
    NSString *addressText = @"..."; //Wherever you get your text from... 
    if ([addressText isEqualToString:@""]==NO) {
        if ([addressText rangeOfString:@" "].location != NSNotFound) {
            //[addressBarTextField setReturnKeyType:UIReturnKeySearch];
            if (addressBarTextField.returnKeyType!=UIReturnKeySearch) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeySearch;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        } else {
            //[addressBarTextField setReturnKeyType:UIReturnKeyGo];
            if (addressBarTextField.returnKeyType!=UIReturnKeyGo) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeyGo;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        }

    } else {
        if (addressBarTextField.returnKeyType!=UIReturnKeyDone) {
            [UIView beginAnimations:nil context:NULL]; //Setup the animation.
            [UIView setAnimationDuration:0.0]; //The duration for the animation.
            [addressBarTextField resignFirstResponder];
            addressBarTextField.returnKeyType = UIReturnKeyDone;
            [addressBarTextField becomeFirstResponder];
            [UIView commitAnimations];
        }
    }
}

基本的に、キーボードを 0.0 秒間アニメーション化しています (ユーザーには表示されません)。また、常に切り替えると遅延が発生するため、切り替える前にキーボードがまだ必要なものではないかどうかも確認しています。

于 2012-05-01T03:26:44.387 に答える
1

テキストフィールドの現在の内容に基づいて returnKeyType (Next <--> Go) を更新する必要がありました。returnKeyType を単独で設定すると、テキスト フィールドの reloadInputViews メソッドが機能しませんでした。他の投稿者が言及しているように、resignFirstResponder とそれに続く becomeFirstResponder が必要でした。私の状況では、textfield が firstResponder になり、キーボードが表示されると、キーボードの非表示と再表示がアニメーション化されます。小さいデバイスやランドスケープ モードでは、テキスト フィールドを含むビューが一瞬ジャンプする原因にもなります。この望ましくない動作を隠すために私が見つけた解決策は、resignFirstResponder と becomeFirstResponder を 0 秒間のアニメーション ブロックに配置することです。

            [UIView animateWithDuration:0.0
                                  delay:0.0
                                options:0
                             animations:^{
                                 [textField reloadInputViews];
                                 [textField resignFirstResponder];
                                 [textField becomeFirstResponder];
                             }
                             completion:nil];
于 2016-09-15T16:55:19.410 に答える
0

TextFieldのデリゲートを使用しようとしましたか?

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {textField.returnKeyType = UIReturnKeySearch; YESを返します。}

于 2012-04-18T04:26:01.707 に答える