Xamarin iOS - 使用返回键导航到下一个文本字段

时间:2013-07-22 08:16:48

标签: ios xamarin

我在Xamarin文档中找不到有关导航到表单上一系列文本字段中的下一个文本字段的内容,只有一个关于删除键盘的小教程。

为了简单起见,我使用的是txtUsername(标记1)文本字段和txtPassword(标记2)文本字段。当我实现以下代码时,它不会转移到Xamarin Studio。有没有人知道这可以在Xamarin Studio中完成代码的方式,或者我可以将代码从XCode传输到Xamarin Studio。

我使用以下代码:

- (BOOL)textFieldShouldReturn:(UITextField *)txtUsername{
    NSLog(@"textFieldShouldReturn:");
    if (txtUsername.tag == 1) {
        UITextField *txtPassword= (UITextField *)[self.view viewWithTag:2];
        [txtPassword becomeFirstResponder];
    }
    else {
        [txtUsername resignFirstResponder];
    }
    return YES;
}

提前致谢

6 个答案:

答案 0 :(得分:7)

我认为最简单的方法是使用BecomeFirstResponder方法在UITextFields上使用ShouldReturn方法。例如,对于具有用户名和密码UITextFields的登录表单,如下所示(在ViewDidLoad方法中):

Username = new UITextField();
Username.ReturnKeyType = UIReturnKeyType.Next;
Username.KeyboardType = UIKeyboardType.EmailAddress;
Username.ShouldReturn = (tf) =>
    {
        Password.BecomeFirstResponder();
        return true;
    };
View.Add(Username);

Password = new UITextField();
Password.SecureTextEntry = true;
Password.ReturnKeyType = UIReturnKeyType.Go;
Password.ShouldReturn = (tf) =>
    {
        // Do your login
        return true;
    };
View.Add(Password);

当用户名处于活动状态时单击“下一步”时,它将移至“密码”字段。单击密码字段中的Go将提交表单。

答案 1 :(得分:2)

您可以使用这些功能

http://iosapi.xamarin.com/?link=M%3aMonoTouch.UIKit.UIResponder.BecomeFirstResponder

BecomeFirstResponder()

http://iosapi.xamarin.com/?link=M%3aMonoTouch.UIKit.UIResponder.ResignFirstResponder

ResignFirstResponder()

根据文档,你应该像这样添加textField Delegate方法

public virtual bool ShouldReturn (UITextField textField)
{

   if (txtUsername.tag == 1) {

    UITextField txtPassword = (UITextField)this.view.ViewWithTag(2);

    txtPassword.BecomeFirstResponder();
   }
   else {
    txtUsername.ResignFirstResponder();
       }
return true;
}

答案 2 :(得分:2)

以下是如何在Xamarin.iOS中实施的示例。可能有其他更简单的方法可以做到这一点,但我找不到任何方法,这对我有用。

我将UITextFieldDelegate子类化为添加自定义事件处理程序,然后在我的视图控制器代码中创建了它的实例,为自定义事件处理程序分配了一个lambda表达式,以便我可以访问实例变量,并将此委托实例设置为Delegate on我的2个字段:

    public class LoginTextFieldDelegate : UITextFieldDelegate
    {
        public EventHandler<UITextField> OnShouldReturn;

        public override bool ShouldReturn(UITextField textField)
        {
            if (OnShouldReturn != null)
            {
                OnShouldReturn(this, textField);
            }

            return true;
        }
    }

然后在我的视图控制器ViewDidLoad方法中:

    var textDelegate = new LoginTextFieldDelegate
    {
        OnShouldReturn = (sender, textField) =>
        {
            if (textField.Tag == txtEmailAddress.Tag)
            {
                txtPassword.BecomeFirstResponder();
            }
            else if (textField.Tag == txtPassword.Tag)
            {
                txtPassword.ResignFirstResponder();
            }
        }
    };

    txtEmailAddress.Delegate = textDelegate;
    txtPassword.Delegate = textDelegate;

不要忘记在代码/接口生成器中的每个UITextField上设置一个不同的标记!

答案 3 :(得分:2)

我为每个表单编写了一个通用解决方案(不仅仅是那些包含2个字段的表单)。

我有一个使用这些方法的BaseViewController:

private UITextField[] formTextfields;
protected void EnableNextKeyForTextFields(UITextField[] fields)
    {
        formTextfields = fields;

        foreach (var field in fields)
        {
            field.ShouldReturn += ShouldReturn;
        }
    }

    private bool ShouldReturn(UITextField textField)
    {
        int index = Array.IndexOf(formTextfields, textField);

        if (index > -1 && index < formTextfields.Length - 1)
        {
            formTextfields[index + 1].BecomeFirstResponder();
            return true;
        }
        else if (index == formTextfields.Length - 1)
        {
            formTextfields[index].ResignFirstResponder();
            FormFinished();
        }

        return false;
    }

    protected virtual void FormFinished()
    {
        // this should be implemented on viewControllers using "EnableNextKeyForTextFields"
    }

然后,在视图实现中,您只需要将所有文本字段传递到一个数组中:

EnableNextKeyForTextFields(new UITextField[] { NameField, SurnameField, EmailField, PasswordField });

当用户在编辑数组的最后一个字段时单击“返回”时,将调用“FormFinished”方法,因此您可以在实现中覆盖它:

protected override void FormFinished()
{
    (ViewModel as RegisterViewModel).Register(); // or whatever you need to do here
}

我希望这对某些人有用

答案 4 :(得分:0)

可以更轻松地使用可用的课程here

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // Manage keyboard and tab order
    new [] {
        usernameField, // Tab order = 0
        passwordField, // Tab order = 1
        emailField // Tab order = 2
    }.InitializeNavigationOnFields();
}

只需调用方法,按照您希望它们通过键盘导航的顺序传递所有文本字段。

答案 5 :(得分:0)

我最近在“登录屏幕”上实现了一种解决方案,该解决方案以一种非常简单且精确的方式来处理该问题。

不确定在首次提出问题时是否存在这些属性和事件,但现在它们将为需要它的其他人提供帮助。

        Entry emailEntry = new Entry()
        {
            Keyboard = Keyboard.Email,
            ReturnType = ReturnType.Next //Changes Return Button on Keyboard to 'Next'
        };

        emailEntry.Completed += (s, e) => passwordEntry.Focus();

按下Return键时,将触发Completed事件。然后,将焦点设置为我的passwordEntry字段。

        Entry passwordEntry = new Entry()
        {
            IsPassword = true,
            ReturnType = ReturnType.Go //Changes Return Button on Keyboard to 'Next'
        }; 

        passwordEntry.Completed += (s, e) => SignInClick(s, e); //SignInClick method handles the sign in functionality

然后输入密码的Completed事件将启动SignInClick方法,该方法以前只能由屏幕上的按钮处理。