2013-07-22 15 views
7

Tôi không thể tìm thấy bất kỳ nội dung nào trong tài liệu Xamarin về điều hướng đến trường văn bản tiếp theo trong một loạt trường văn bản trên biểu mẫu, chỉ một hướng dẫn nhỏ về cách xóa bàn phím.Xamarin iOS - Điều hướng đến trường văn bản tiếp theo bằng phím return

Để giữ cho mọi thứ đơn giản, tôi đang sử dụng trường văn bản txtUsername (thẻ 1) và trường văn bản txtPassword (thẻ 2). Khi tôi triển khai mã sau đây, nó không được chuyển sang Xamarin Studio. Có ai biết cách này có thể được thực hiện mã trong Xamarin Studio, hoặc cách khác, nếu tôi có thể chuyển mã từ XCode để Xamarin Studio.

Tôi đang sử dụng đoạn mã sau:

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

Cảm ơn trước

Trả lời

2

Bạn có thể tận dụng các chức năng này

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

BecomeFirstResponder() 

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

ResignFirstResponder() 

Theo tài liệu bạn nên thêm các phương pháp TextField Đại biểu như thế này

public virtual bool ShouldReturn (UITextField textField) 
{ 

    if (txtUsername.tag == 1) { 

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

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

Ah vâng, tôi không nghĩ đến việc tìm trong tài liệu API, tôi đã xem Hướng dẫn và Hướng dẫn. Nếu bạn có thể cho tôi biết làm thế nào bạn nhận được trên đó sẽ là tuyệt vời, tôi mới đến Xamarin và XCode nhưng tôi sẽ có một đi lúc thực hiện chúng khi tôi về nhà sau này. –

+0

Hãy thử thực hiện ở trên, tôi không chắc chắn nó sẽ làm việc! – satheeshwaran

+0

Cảm ơn bạn rất nhiều, tôi vừa thử nghiệm phương pháp này và nó hoạt động hoàn hảo! –

2

Dưới đây là một ví dụ về cách thức để thực hiện trong Xamarin.iOS. Có thể có những cách đơn giản hơn để làm điều này nhưng tôi không thể tìm thấy bất kỳ, và điều này làm việc cho tôi.

Tôi đã xếp lớp con UITextFieldDelegate để thêm trình xử lý sự kiện tùy chỉnh, sau đó tạo biểu thức lambda cho trình xử lý sự kiện tùy chỉnh để tôi có thể truy cập các biến mẫu và đặt thể hiện ủy nhiệm này làm Đại biểu trên các lĩnh vực 2 ext tôi:

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

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

      return true; 
     } 
    } 

Sau đó, theo quan điểm phương pháp điều khiển viewDidLoad của tôi:

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; 

Đừng quên để thiết lập một thẻ riêng biệt trên mỗi UITextField trong mã/Interface Builder!

2

Tôi đã viết một giải pháp chung cho mọi hình thức (không chỉ những người có 2 trường).

Tôi đã có một BaseViewController với những phương pháp:

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" 
    } 

Sau đó, trong việc thực hiện tầm nhìn của bạn, bạn chỉ cần phải vượt qua tất cả các textfields của bạn trong một mảng duy nhất:

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

Khi người dùng nhấp vào "trả lại" khi chỉnh sửa trường cuối cùng của mảng, phương thức "FormFinished" sẽ được gọi, vì vậy bạn có thể ghi đè nó trong quá trình triển khai của mình:

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

Tôi hy vọng điều này rất hữu ích cho ai đó

0

thể được dễ dàng hơn để sử dụng lớp sẵn 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(); 
} 

Chỉ cần gọi phương thức đi qua tất cả các lĩnh vực văn bản theo thứ tự bạn muốn họ được điều hướng thông qua các bàn phím.

6

Tôi nghĩ rằng cách đơn giản nhất để thực hiện việc này là sử dụng phương pháp ShouldReturn trên UITextField của bạn với phương thức BecomeFirstResponder. Ví dụ, đối với một mẫu đăng nhập với Username và Password UITextFields, như sau (trong phương pháp viewDidLoad của bạn):

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); 

Khi bạn nhấp tiếp theo khi vào Username được kích hoạt, nó di chuyển đến trường Password. Nhấp vào Tìm trong trường mật khẩu gửi biểu mẫu.