1

2つのテキストフィールド(ユーザー名とパスワード)を含むログイン画面があります。ユーザーがいずれかのテキストフィールドをクリックすると、キーボードが表示され、すべて問題ありません。ただし、ユーザーが最初のテキストフィールドで(キーボードの)[完了]をクリックする前に他のテキストフィールドをクリックした場合、ユーザー名のテキストは保存されません。元のテキストフィールドテキストを保存する唯一の方法は、テキストフィールドをクリックして[完了]を選択することです。

最初のテキストフィールドのキーボードがまだ開いている間、他のテキストフィールドがキーボードを表示しないようにしたいのですが、それが理にかなっている場合はどうでしょうか。テキストフィールドが編集できないようにする方法があることは知っていますが、キーボードがすでに開いていることをどのように知ることができますか?

別の解決策は、ユーザーがテキストフィールドの外側をクリックするたびにキーボードを無効にすることです。どうすればいいですか?

これが私のコードです:

textFieldEmail = [[UITextField alloc] initWithFrame:frame];

textFieldEmail.keyboardType = UIKeyboardTypeEmailAddress;

textFieldEmail.returnKeyType = UIReturnKeyDone;     
textFieldEmail.tag = 0;     
textFieldEmail.delegate = [[UIApplication sharedApplication] delegate];

textFieldPassword = [[UITextField alloc] initWithFrame:frame];

textFieldPassword.keyboardType = UIKeyboardTypeEmailAddress;

textFieldPassword.returnKeyType = UIReturnKeyDone;      
textFieldPassword.tag = 1;      
textFieldPassword.delegate = [[UIApplication sharedApplication] delegate];

- (BOOL) textFieldShouldReturn:(UITextField *)textField {

    [textField resignFirstResponder];

    return YES;

}

ありがとう!

4

4 に答える 4

1

私はあなたがこれをしたいのはあなただけがこれをすることができるようにすることです。

#pragma mark -
#pragma mark UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    if(textField == textFieldEmail){
        [textFieldPassword setUserInteractionEnabled:NO];
    }
    else if(textField == textFieldPassword)
        [textFieldEmail setUserInteractionEnabled:NO];
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textFieldEmail setUserInteractionEnabled:YES];
    [textFieldPassword setUserInteractionEnabled:YES];
    [textField resignFirstResponder];
    return YES;
}

しかし、私が付け加えたいことの1つは、UIをブロックすることは、iPhoneアプリを開発する上で非常に悪い考えです。目標を達成するための多くの回避策があります。ブロッキングUIを使用しないようにしてください。

お役に立てれば。ありがとう

于 2009-12-19T05:01:40.463 に答える
0

たとえば、BOOL型のneededInfoHasBeenEnteredのようなsmthのようなフラグを作成し、それをtextFieldShouldBeginEditing他のすべてのtextFieldsのデリゲートメソッドに返すことができます。

于 2009-11-25T11:43:42.207 に答える
0

これには、2つの異なる方法でアプローチできます。

上のテキストフィールドのuserInteractionを無効にします

- (void)textFieldDidBeginEditing:(UITextField *)textField
{

 if(textfield  == textFieldEmail)

   {

      textFieldPassword.userInteractionEnabled =  NO;

   }else if(textfield  == textFieldPassword){

     textFieldEmail.userInteractionEnabled =  NO;

   }

- (void)textFieldDidEndEditing:(UITextField *)textField
{

  textFieldPassword.userInteractionEnabled =  YES;

   textFieldEmail.userInteractionEnabled =  YES;

}

また

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{

UITextField *theOtherTextField;

 if(textView == textFieldEmail)

   {

      theOtherTextField = textFieldPassword;
}
else if(textfield  == textFieldPassword)
{

theOtherTextField = textFieldEmail;  
}

return ![theOtherTextField isFirstResponder];  
//Return no if the other text field is the first responder

}
于 2009-11-25T18:46:36.067 に答える
0

同じ問題が発生し、上記のコードを試しましたが、正常に機能していました。このコードは私にとって非常に役立ちます。ビューに4つのtextFieldがあり、コードを次のように使用しました。

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    if(textField == eventTextField){
                [eventPlaceTextField setUserInteractionEnabled:NO];
        [wineryTitleLabel setUserInteractionEnabled:NO];
        [vintageTextField setUserInteractionEnabled:NO];
    }
    else if(textField == eventPlaceTextField)
    {
            [wineryTitleLabel setUserInteractionEnabled:NO];
        [vintageTextField setUserInteractionEnabled:NO];
    }
    else if(textField == wineryTitleLabel)
    {
            [vintageTextField setUserInteractionEnabled:NO];
    } 
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    int vintageVal = [vintageTextField.text intValue];  

    if(textField == eventTextField)
    {
        event.eventName = eventTextField.text;
        [eventTextField setUserInteractionEnabled:YES];
        [eventPlaceTextField becomeFirstResponder];
        [textField resignFirstResponder];
    }
    else if(textField == eventPlaceTextField)
    {
        event.eventPlace = eventPlaceTextField.text;
        [eventPlaceTextField setUserInteractionEnabled:YES];
        [wineryTitleLabel becomeFirstResponder];
        [textField resignFirstResponder];
    }
    else if(textField == wineryTitleLabel)
    {
        event.eventWinery = wineryTitleLabel.text;
        [wineryTitleLabel setUserInteractionEnabled:YES];
        [vintageTextField becomeFirstResponder];
        [textField resignFirstResponder];
    }
    else if(textField == vintageTextField)
    {
        if([vintageTextField.text length] == 4 || [vintageTextField.text length]==0)
        {
            event.eventVintage = vintageVal;
        }
        else
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"!!!WARNING!!!" message:@"Enter the Vintage in the format 'YYYY'"
                                                           delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];   
            [alert release];
            return NO;
        }

        [vintageTextField setUserInteractionEnabled:YES];
        [self setViewMovedUp:NO];
        [textField resignFirstResponder];
    }

    return YES;
}
于 2010-01-28T06:22:05.793 に答える