문제

키보드를 닫고 싶을 때 첫 번째 응답자를 사임하도록 UITextField에 지시해야 한다는 것을 알고 있지만 사용자가 키보드에서 "완료" 키를 눌렀는지 어떻게 알 수 있는지 잘 모르겠습니다.내가 확인할 수 있는 알림이 있나요?

도움이 되었습니까?

해결책

나는 대의원을 설정했다 UITextField 나에게 ViewController 수업.

해당 클래스 에서이 방법을 다음과 같이 구현했습니다.

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

다른 팁

텍스트 필드의 didendOnexit 이벤트를 InterfaceBuilder의 ACTION (IBACTION)에 연결하면 사용자가 키보드를 기각 할 때 메시지가 표시되며 발신자는 이벤트를 시작한 UITEXTFIELD를 참조합니다.

예를 들어:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

그런 다음 InterfaceBuilder에서 텍스트 필드의 didendOnexit 이벤트를 컨트롤러 에서이 작업 (또는 UI의 이벤트를 연결하는 데 사용하는 항목)을 연결하십시오. 사용자가 텍스트를 입력하고 텍스트 필드를 기각 할 때마다 컨트롤러 가이 메시지를 전달합니다.

컨트롤러에서 메소드를 만들 수도 있습니다

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

그런 다음 IB Connect 이벤트의 Inspector Inspector에서 "Eng on Exit"에 이르렀습니다.

쿠비, 감사합니다. 코드가 작동했습니다. 당신이 말하는 것처럼 명시 적으로 (초보자를 위해) UITextField'에스 delegate 텍스트 필드가있는 ViewController와 동일합니다. 당신은 당신이 원하는 곳마다 이것을 할 수 있습니다. 나는 선택했다 viewDidLoad 방법.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}

다음은 코드가 전혀없는 자동 키보드 해고 동작을 얻는 요령입니다. NIB에서 Identity Inspector의 첫 번째 응답자 프록시 객체를 편집하여 새로운 첫 번째 응답자 조치를 추가하십시오. 그것을 부르자 dummy:. 이제 텍스트 필드의 종료 이벤트에서 끝나는 끝을 dummy: 첫 번째 응답자 프록시 객체의 동작. 그게 다야! 텍스트 필드가 종료 된 이벤트에서 끝났으므로 이제 액션 - 표적 쌍이 있으므로 텍스트 필드는 사용자가 탭하면 키보드를 자동으로 기각합니다. 그리고 응답자 체인을 전송하는 메시지에 대한 핸들러를 찾지 못한 것에 대한 페널티가 없기 때문에 구현이 없어도 앱은 충돌하지 않습니다. dummy: 어딘가에.

그냥 추가하십시오

[textField endEditing:YES];

키보드를 비활성화하고 피커보기를 표시하려는 경우.

Swift에서는 컨트롤러에 iBaction을 작성하고 출구로 끝났습니다 그 행동에 대한 텍스트 필드의 사건

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

당신은 또한 사용할 수 있습니다

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

   [self.yourTextField resignFirstResponder];

  }

당신이 많은 uitextfields를 가지고 있다면 최고의 것 :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

이것이 작동하도록 하기 위해 내가 해야 할 일은 다음과 같습니다. 키보드용 숫자 패드가 있는 사람(또는 완료 버튼이 없는 다른 사람)에게 필요하다고 생각합니다.

  1. ViewController의 UIView를 UIControl로 변경했습니다.
  2. 나는라는 함수를 만들었습니다.

    -(IBAction)backgroundIsTapped:(id)sender
    

이는 .h 파일에도 정의되어 있습니다.

그런 다음 Interface Builder의 ViewController에 대한 '터치다운' 비트에 연결했습니다.

'배경 탭됨' 기능에 다음을 넣었습니다.

    [answerField resignFirstResponder];

키보드를 제거하려는 UITextField의 이름으로 'answerField'를 변경하는 것을 잊지 마세요. (물론 UITextField가 아래와 같이 정의되어 있는지 확인하세요.)

    IBOutlet UITextField * <nameoftextfieldhere>;

나는 이 주제가 아마도 오래 전에 사라졌다는 것을 알고 있습니다.하지만 이것이 누군가, 어딘가에서 도움이 되기를 바라고 있습니다!

"TextFieldShouldReTurn"방법은 완료 키를 누르는 텍스트 필드 객체를 제공합니다. 태그를 설정하면 해당 텍스트 필드를 켜면 전환 할 수 있습니다. 또는 객체의 포인터를 제작자가 저장 한 멤버 값과 추적하고 비교할 수 있습니다.

내 접근 방식은 자기 학습에 대한 것입니다.

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

한편, 나는 사임을 거부하는 "검증"테스트를 발표했다. 사용자가 유형이 아닌 경우에만 그림을위한 것입니다! 현장에서는 해고되지 않습니다. 동작은 내가 원했던 것과 같았지만 출력 순서는 내가 예상했던 것과 같지 않았습니다.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

다음은이 거부에 대한 나의 NSLOG 출력과 수락이 뒤 따릅니다. 당신은 내가 사임 결과를 반환하고 있음을 알 수 있지만, 나는 그것이 발신자에게 다시보고하기 위해 False를 반환 할 것으로 기대 했습니까?! 그 외에는 필요한 행동이 있습니다.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard

다음은 반환 키 또는 백그라운드에서 터치로 에디션을 종료하는 매우 깨끗한 방법입니다.

인터페이스 빌더에서 클래스 uiformView의 관점에서 필드를 포함하십시오.

이 수업은 무엇을합니까 :

  • Fields Delegate (NIB에서 깨어 났거나 수동으로 추가)로 자동으로 첨부하십시오.
  • 현재 편집 된 필드에 대한 참조를 유지하십시오
  • 리턴에서 키보드를 무시하거나 백그라운드에서 터치합니다.

코드는 다음과 같습니다.

상호 작용

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

구현

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • 양식을 서브 클래스하고 재정의함으로써textFieldValueIsValid: 방법, 주어진 필드에 대해 값이 올바르지 않으면 판 끝을 피할 수 있습니다.

  • 필드에 인터페이스 빌더에 대의원 세트가있는 경우 양식이 변경되지 않습니다. 다른 대표단을 특정 필드로 설정 해야하는 이유는 많지 않지만 왜…

이 양식보기 클래스를 개선하는 방법에는 여러 가지가 있습니다 - 대의원을 첨부하고, 일부 레이아웃을 수행하고, 키보드가 필드를 덮을 때 (CurrenteditingTextField 프레임 사용), 다음 필드의 에디션을 자동으로 시작하는 경우 ...

나는 개인적으로 그것을 내 프레임 워크에 보관하고 항상 기능을 추가하기 위해 서브 클래스를 유지하면 종종 "as-is"가 유용합니다.

도움이되기를 바랍니다. 모두를 건배합니다

UIViewController에서 모든 편집을 원한다면 사용할 수 있습니다.

[[self view]endEditing:YES];

그리고 당신이 uitextfield 키보드 가죽을 무시하고 싶다면 사용하십시오.

1. viewController.h에 대의원을집니다

<UITextFieldDelegate>
  1. 대표단을 텍스트 필드에 할 수 없도록하십시오.

    self.yourtextfield.delegate = self;

  2. 이 메소드를 ViewController에 추가하십시오.

    -(bool) TextfieldShouldending : (uitextfield *) Textfield {[Textfield riSignFirstResponder]; 반환 예;}

프로그래밍 방식으로 Swift 3에서 Uitextfield 대의원을 설정했습니다.

viewController.swift 파일에서 UitextFieldDelegate 구현 (예 : 클래스 ViewController : uiviewController, UitextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// 마크 :- 대의원 텍스트 필드 처리 ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}

기능 Hidekeyboard를 만들고 .xib 파일의 텍스트 필드에 링크하고 didendonexit을 선택하십시오.

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

인터페이스 빌더를 사용하여보기를 만든 경우 다음을 사용하여 메소드를 작성하십시오.

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

보기에서 텍스트 필드를 마우스 오른쪽 버튼으로 클릭하고 Exit에서 끝났던대로 이벤트를 설정하고 "DismisskeyBoard"메소드에이를 배선하십시오.

초보자를위한 최고의 안내서는 "Head First iphone and iPad Development, 2nd Edition"입니다.

이 시도

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

누구든지 찾고 있습니다 스위프트 3

1) 당신을 확인하십시오 Uitextfield의 대표 스토리 보드의 ViewController에 연결되어 있습니다

2) 구현 uitextfielddelegate viewController.swift 파일에서 (예 : 클래스 ViewController : uiviewController, uitextfieldDelegate {)

3) 아래의 대표 방법을 사용하십시오

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }

이것이 Swift 4.2에서 키보드를 기각하는 방법입니다.

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

스위프트 3, iOS 9+

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD : 여전히 나에게 잘 작동합니다. 이 답변을 바친 사람은 그가이 행동을 스토리 보드의 Uitextfield에 묶어야한다는 것을 이해하지 못했다고 생각합니다.

textField.returnKeyType = UIReturnKeyDone;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top