sourcetip

UI 텍스트 필드를 편집할 때 키보드를 해제하는 방법

fileupload 2023. 6. 2. 21:16
반응형

UI 텍스트 필드를 편집할 때 키보드를 해제하는 방법

키보드를 해제하려면 UITtextField에서 첫 번째 응답자를 사임하도록 해야 한다는 것을 알고 있지만 사용자가 키보드의 "완료" 키를 눌렀을 때 어떻게 알 수 있는지 모르겠습니다.제가 볼 수 있는 알림이 있나요?

는 나는대을설다니의 을 정했습니다.UITextField나에게ViewController학급.

그 수업에서 저는 이 방법을 다음과 같이 구현했습니다.

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

텍스트 필드의 DidEndOnExit 이벤트를 InterfaceBuilder의 작업(IBAction)에 연결하면 사용자가 반환 키를 사용하여 키보드를 해제할 때 메시지가 표시되고 보낸 사람은 이벤트를 발생시킨 UIT 텍스트 필드에 대한 참조가 됩니다.

예:

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

그런 다음 Interface Builder에서 텍스트 필드의 DidEndOnExit 이벤트를 컨트롤러(또는 UI에서 이벤트를 연결하는 데 사용하는 작업)에 연결합니다.사용자가 텍스트를 입력하고 텍스트 필드를 해제할 때마다 컨트롤러에 이 메시지가 전송됩니다.

컨트롤러에서 메서드를 생성할 수도 있습니다.

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

그런 다음 IB의 Connection Inspector에서 이벤트 "종료 시 종료"를 연결합니다.

쿠비, 감사합니다.코드가 작동했습니다.당신이 말하는 것처럼 명시적으로 (신입생들을 위해) 당신이 설정해야 합니다.UITextFielddelegate텍스트 필드가 있는 보기 컨트롤러와 동일합니다.이것은 당신이 원하는 곳 어디서든 할 수 있습니다.제가 선택한 것은viewDidLoad방법.

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

여기 코드가 전혀 없는 자동 키보드 해제 동작을 얻는 요령이 있습니다.하고 새 작업을 이 작업을 First Responder 작업이라고 . First Responder 프록시 개체는 First Responder 프록시 개체입니다.dummy:를 Did End on Exit에 합니다.dummy:First Responder 프록시 개체의 작업입니다. 필드의 on 텍스트 필드의 됩니다. 에 대한 를 찾지 .텍스트 필드의 Did End on Exit 이벤트에 액션-타깃 쌍이 있으므로 사용자가 Return을 누르면 텍스트 필드의 키보드가 자동으로 해제됩니다. 응답기 체인으로 전송된 메시지에 대한 핸들러를 찾지 못해도 페널티가 없기 때문에 앱이 충돌하지 않습니다.dummy:아무 곳이나.

Swift에서 컨트롤러에 IBA 액션을 작성하고 텍스트 필드의 Did End On Exit 이벤트를 해당 액션으로 설정할 수 있습니다.

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

그냥 추가

[textField endEditing:YES];

키보드를 비활성화하고 선택기 보기를 표시할 수 있습니다.

Swift 4.2그리고 그것은 100% 작동할 것입니다.

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

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

    // user presses return key

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

}

사용할 수도 있습니다.

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

   [self.yourTextField resignFirstResponder];

  }

많은 Uitext 필드가 있는 경우 가장 좋습니다.

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

다음은 키보드를 작동시키기 위해 제가 해야 할 일입니다. 키보드용 숫자 패드가 있는 사용자(또는 완료된 버튼이 없는 사용자)는 누구나 필요하다고 생각합니다.

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

    -(IBAction)backgroundIsTapped:(id)sender
    

이는 .h 파일에서도 정의되었습니다.

그 후, 인터페이스 빌더에서 View 컨트롤러의 '터치다운' 비트에 연결했습니다.

'background is tapped' 기능에서 다음과 같이 입력했습니다.

    [answerField resignFirstResponder];

'answerField'를 키보드를 제거할 UITextField의 이름으로 변경하는 것을 기억하십시오(UITtextField가 아래와 같이 정의되어 있는지 확인하십시오).

    IBOutlet UITextField * <nameoftextfieldhere>;

이 주제는 아마 오래전에 사라졌을 겁니다하지만 이것이 누군가에게 도움이 되기를 바랍니다, 어딘가에서!

"textFieldShouldReturn" 메서드는 DONE 키를 누른 텍스트 필드 개체를 제공합니다.태그를 설정하면 해당 텍스트 필드를 전환할 수 있습니다.또는 개체의 포인터를 추적하여 작성자가 저장한 일부 구성원 값과 비교할 수 있습니다.

제 접근 방식은 다음과 같습니다.

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

    bool fDidResign = [textField resignFirstResponder];

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

    return fDidResign;
}

그러면서 사퇴를 부정하는 '유효성' 시험을 치렀습니다.이는 설명용이므로 사용자가 필드에 NO!를 입력해도 무시되지 않습니다.동작은 내가 원하는 대로였지만, 출력 순서는 내가 예상했던 것과 다릅니다.

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

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

다음은 이 거부에 대한 NSLog 출력과 수락입니다.제가 사직서 결과를 반환한다는 것을 알게 될 것입니다. 하지만 저는 그것이 발신자에게 다시 보고하기 위해 거짓으로 반환될 것이라고 예상했습니다.!그 외에도, 그것은 필요한 행동을 합니다.

13.313 연구 Kbd [109:207] -[연구 KbdView 컨트롤러 텍스트 필드 반환해야 함:]13.320 StudyKbd [109:207] -[StudyKbdViewController 텍스트 필드 편집을 종료해야 함:]13.327 연구 Kbd [109:207] 아니오!13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: 키보드를 종료했습니다.59.891 StudyKbd [109:207] -[StudyKbdViewController 텍스트 필드 반환해야 함:]59.897 StudyKbd [109:207] -[StudyKbdViewController 텍스트 필드 편집을 종료해야 함:]59.917 StudyKbd [109:207] -[StudyKbdView 컨트롤러 편집 완료]텍스트]: 아니요59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: 키보드를 종료했습니다.

반환 키를 사용하거나 백그라운드에서 터치하여 에디션을 종료하는 꽤 깔끔한 방법이 있습니다.

인터페이스 작성기에서 클래스 UIFormView 보기에 필드를 포함합니다.

이 클래스는 무엇입니까?

  • 필드 대리자로 자동 부착(닙에서 깨거나 수동으로 추가)
  • 현재 편집된 필드에 대한 참조 유지
  • 반환 시 키보드를 해제하거나 백그라운드에서 터치

코드는 다음과 같습니다.

인터페이스

#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:메소드, 값이 지정된 필드에 대해 올바르지 않은 경우 버전 종료를 피할 수 있습니다.

  • 필드에 인터페이스 작성기에 대리자 집합이 있는 경우, 양식은 필드를 변경하지 않습니다.특정 분야에 다른 대리인을 배치해야 할 이유는 별로 없다고 생각합니다만, 왜 그렇지 않습니까?

이 양식 보기 클래스를 개선하는 방법은 여러 가지가 있습니다. 대리자를 부착하고, 레이아웃을 수행하고, 키보드가 필드를 덮을 때 처리합니다(현재 편집 텍스트 필드 프레임 사용). 다음 필드에 대한 버전을 자동으로 시작합니다.

저는 개인적으로 이를 프레임워크에 보관하고 있으며 기능을 추가하기 위해 항상 하위 클래스로 분류하기 때문에 "있는 그대로" 유용한 경우가 많습니다.

도움이 되길 바랍니다.건배!

의 모든 편집을 사용할 수 있는 UIViewController에서 수행할 수 있습니다.

[[self view]endEditing:YES];

특정 UITextField 키보드를 해제하려면 숨깁니다.

1.뷰 컨트롤러에 대리자 추가.h

<UITextFieldDelegate>
  1. 텍스트 필드에 대한 위임을 수행할 수 없습니다.

    self.yourTextField.delegate = self;

  2. 이 메서드를 보기 컨트롤러에 추가합니다.

    -(BOOL)textFieldShouldEditing:(UITextField *)textField{ [textField resignFirstResponder]; YES;} 반환

스위프트 3를 찾는 사람.

UITextField의 대리인이 스토리보드의 View 컨트롤러에 연결되어 있는지 확인합니다.

View 컨트롤러에서 UITextFieldDelegate를 구현합니다.Swift 파일(예: ViewController 클래스:UIView 컨트롤러, UITextField 딜러 { )

아래 대리인 방법 사용

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

프로그래밍 방식으로 UI 텍스트 필드의 대리자를 swift 3으로 설정합니다.

View 컨트롤러에서 UITextFieldDelegate를 구현합니다.Swift 파일(예: ViewController 클래스:UIView 컨트롤러, UITextField 딜러 { )

 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
}()

Mark:- 대리자 textField를 처리합니다.

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
}

함수 숨기기 키보드를 만들어 .xib 파일의 텍스트 필드에 연결하고 DidEndOnExit을 선택합니다.

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

Interface Builder를 사용하여 뷰를 작성한 경우 다음을 사용합니다. 메서드만 만듭니다.

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

보기에서 텍스트 필드를 마우스 오른쪽 단추로 클릭하고 이벤트를 종료 시 종료로 설정한 후 "키보드 해제" 메서드에 연결합니다.

초보자를 위한 최고의 가이드는 "헤드 퍼스트 아이폰과 아이패드 개발, 2판"입니다.

이것을 먹어보세요.

- (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;
}

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) {}

업데이트: 여전히 잘 작동합니다.제 생각에 이 답변을 쓴 사람은 이 행동을 스토리보드의 UI 텍스트 필드에 바인딩해야 한다는 것을 이해하지 못했습니다.

textField.returnKeyType = UIReturnKeyDone;

언급URL : https://stackoverflow.com/questions/274319/how-do-you-dismiss-the-keyboard-when-editing-a-uitextfield

반응형