2011-07-14 27 views
12

Có một ứng dụng mà tôi đang tạo nhiều UITextFields động. Tôi muốn từ chối yêu cầu trả lời đầu tiên bất cứ khi nào UITextFields không được chọn (chạm vào bên ngoài UITextField). Làm thế nào tôi có thể biết rằng trong số đó UITextField Tôi phải từ chức trả lời đầu tiên? Vui lòng chỉ định bất kỳ cách nào khác ngoài khái niệm 'thẻ' vì tôi đã thử điều đó. Vui lòng đề xuất đúng hướng. Cảm ơn trước.Từ chối phản hồi đầu tiên cho nhiều UITextFields

+0

thể trùng lặp của [Cách dễ dàng để bỏ bàn phím?] (Http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard) – Loukas

Trả lời

0

Bạn có thể đặt textFields làm thuộc tính và tổng hợp chúng. Bạn sẽ cần nhiều thuộc tính như bạn đang sử dụng trong ứng dụng của mình.

Bạn có thể có @synthesise myTextField0, myTextField1, myTextField2; cho ba textFields. Chỉ cần gán mỗi UITextField bạn đang sử dụng cho các thuộc tính này, trong khi khai báo chúng.

Và khi bạn muốn từ chức, chỉ cần sử dụng [self.myTextField0 resignFirstResponder] tại textFieldDidEndEditing hoặc chức năng nào bạn muốn từ chức chúng. Và bạn cũng có thể sử dụng nó cho các textField khác. Đây là cách để xử lý nhiều textfields

Nói chung, bạn có thể bỏ qua tất cả các bước này, với textField.returnKeyType = UIReturnKeyDone; nếu bạn có một chìa khóa DONE Đổi lại, bạn chỉ có thể đi đến phương pháp

- (BOOL) textFieldShouldReturn:(UITextField *)textField 
{ 
[textField resignFirstResponder]; 
return 1; 
} 

hoặc bạn có thể sử dụng tags để gắn thẻ một số textFields nhất định và sau đó từ chức những cái cụ thể.

+0

nhờ cho phản ứng nhưng vấn đề là các tạo UITextField tự động ... cũng không thể biết bao nhiêu sẽ có? Vì vậy, cũng như không thể tổng hợp và vì vậy mọi thứ ... Mặc dù đã thực hiện theo cách khác !! Cảm ơn!! –

3

sử dụng đoạn mã này và thực hiện

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
    if (nextResponder) { 
    // Found next responder, so set it. 
    [nextResponder becomeFirstResponder]; 
    } else { 
    // Not found, so remove keyboard. 
    [textField resignFirstResponder]; 
    } 
    return NO; // We do not want UITextField to insert line-breaks. 
} 
+0

Cảm ơn @Deepesh để phản hồi nhanh !! –

3

Bạn có thể thực hiện phương pháp đại biểu

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

trong đó bạn có thể mất currentTextField = TextField;

trong một phương pháp đại biểu

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

bạn có thể làm currentTextField = nil;

bạn có thể từ chức currentTextField ....

+0

+1 cho câu trả lời rất đơn giản và đúng sự thật. –

+0

@Jennis: Cảm ơn :) – iMOBDEV

+0

@ Cảm ơn bạn đã phản hồi nhanh chóng và đơn giản !! yess tôi đã thực hiện thông qua !! –

0

bạn có thể kiểm tra với isFirstResponder. Tại bất kỳ thời điểm nào, chỉ một UIResponder (UITextField trong trường hợp của bạn) có thể là .

+0

Cảm ơn bạn đã đề xuất !! Tôi đã làm nó bằng cách khác nhưng muốn biết thủ tục đầy đủ của bạn .. bạn có thể gửi một khối mã? Cảm ơn trước!! –

0

Bằng cách này .. tôi đã thực hiện điều này theo cách khác .. Không tìm kiếm một công nghệ Champ lập trình khá tốt nhưng đủ để giải quyết công việc của tôi !!

for(UIView *v in self.view.subviews) 
    { 
     if(([v isMemberOfClass:[UITextField class]]==YES) && !(CGRectContainsPoint(v.frame,[[touches anyObject] locationInView:self.View))) 
      { 
       v.userInteractionEnabled=NO; 
       if([v isEditing]) 
       { 
       [v resignFirstResponder]; 
       } 
      } 
    } 
3

Bạn có thể thử nó như thế này:

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 

    for (id textField in self.view.subviews) { 

     if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) { 
      [textField resignFirstResponder]; 
     } 
    } 
} 

Tôi không thử nó nhưng có vẻ như một giải pháp tốt

49

Đừng gọi resignFirstResponder; hãy gọi endEditing:!

Gọi endEditing: trên bất kỳ chế độ xem nào phía trên các trường văn bản trong cấu trúc phân cấp chế độ xem. Nó sẽ xác định vị trí trả lời đầu tiên và yêu cầu nó từ chức.Sử dụng endEditing:YES để ép buộc hoặc endEditing:NO để cho đại diện của trường văn bản quyết định xem có nên kết thúc chỉnh sửa hay không (hữu ích nếu bạn đang xác thực đầu vào).

8
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view 
-1

Bạn có thể sử dụng thay vì endEditingresignFirstResponder

Hãy thử này

[self.view EndEditing:YES] 
+0

câu trả lời tương tự đã được đưa ra – Loukas

0

Sử dụng [self.view endEditing:YES]; để resignFirstResponder cho UITextField hoạt động hiện hành.

1

Cách chung nhất và cũng là người duy nhất làm việc cho tôi trong một UITableViewController được gửi action xuống responder chuỗi và chờ cho đối tượng ngay để nhận được hành động:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Tested trong iOS8

0

Điều này hiệu quả với tôi trong Xamarin.iOS/Monotouch. Thay đổi nút bàn phím thành Tiếp theo, chuyển điều khiển sang UITextField tiếp theo và ẩn bàn phím sau UITextField cuối cùng.

private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout) 
{ 
    foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField))) 
    { 
    (item as UITextField).ReturnKeyType = UIReturnKeyType.Next; 
    (item as UITextField).ShouldReturn += (textField) => 
    { 
     nint nextTag = textField.Tag + 1; 
     var nextResponder = textField.Superview.ViewWithTag(nextTag); 
     if (null != nextResponder) 
      nextResponder.BecomeFirstResponder(); 
     else 
      textField.Superview.EndEditing(true); 
      //You could also use textField.ResignFirstResponder(); but the above line makes some users happier (e.g. benzado) 

     return false; // We do not want UITextField to insert line-breaks. 
    }; 
    } 
} 

Bên trong viewDidLoad bạn sẽ có:

Nếu Trường văn bản của bạn có không phải là một khóa thiết lập nó bây giờ:

txtField1.Tag = 0; 
txtField2.Tag = 1; 
txtField3.Tag = 2; 
//... 

và chỉ cần gọi

SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList()); 
//If you are not sure of which view contains your fields you can also call it in a safer way: 
SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList()); 
//You can also reuse the same method with different containerViews in case your UITextField are under different views. 
0

Tôi gặp sự cố trong Từ chối phản hồi đầu tiên cho UITextField đã chọn từ nhiều TextField. Tôi thấy đây là đang hoạt động cho tôi sau rất nhiều giải pháp khác nhau.

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

    for (id textField in self.view.subviews) { 

     if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel]) { 
      [textField resignFirstResponder]; 
     } 
    } 
} 
Các vấn đề liên quan