iphone - ios uikeyboardtype




UITextField를 편집 할 때 키보드를 어떻게 닫습니까? (14)

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

내 접근법은 자습을 위해 다음과 같이합니다.

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

키보드를 닫을 때 첫 번째 응답자를 사퇴하도록 UITextField에 알릴 필요가 있지만 키보드에서 "완료"키를 눌렀을 때를 알 수있는 방법을 모르겠습니다. 내가 볼 수있는 알림이 있습니까?


Interface Builder를 사용하여 뷰를 생성 한 경우 다음을 사용하십시오. 메소드를 생성하십시오.

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

보기에서 텍스트 필드를 마우스 오른쪽 버튼으로 클릭하고 종료시 끝나기로 이벤트를 설정 한 다음 메서드 "dismissKeyboard"에 연결합니다.

초보자를위한 최고의 가이드는 "헤드 퍼스트 iPhone 및 iPad 개발, 2 판"


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

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

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

[[self view]endEditing:YES];

peritular UITextField 키보드 숨기기를 원한다면 사용하십시오.

viewcontroller.h에 1.add 대리자 추가

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

    self.yourTextField.delegate = self;

  2. 이 메서드를 viewcontroller에 추가하십시오.

    - (BOOL) textFieldShouldEndEditing : (UITextField *) textField {[textField resignFirstResponder]; return YES;}


여기에 그것이 작동하도록하기 위해해야 ​​할 일이 있습니다. 키보드를 사용하는 숫자 패드 (또는 완성 된 버튼이없는 다른 것들)를 가진 사람이라면 누구나 필요하다고 생각합니다.

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

    -(IBAction)backgroundIsTapped:(id)sender
    

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

이 후, 필자는 Interface Builder에서 ViewController의 '터치 다운'비트에 연결했습니다.

'background is tap'함수에서, 나는 이것을 넣었다.

    [answerField resignFirstResponder];

'answerField'를 키보드를 제거 할 UITextField의 이름으로 변경하는 것을 잊지 마십시오 (분명히 UITextField가 아래와 같이 정의되어 있는지 확인하십시오 :)

    IBOutlet UITextField * <nameoftextfieldhere>;

나는이 주제가 아마도 오래전에 죽었다는 것을 알고있다 ... 그러나 나는 누군가가 어딘가에 도움이되기를 바라고있다.


이 시도

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

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

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

IB의 Connection Inspector에서 "Exit End On Exit"이벤트를 연결하십시오.


코드없이 자동 키보드 해고 동작을 얻는 방법은 다음과 같습니다. 펜촉에서 Identity Inspector에서 First Responder 프록시 객체를 편집하고 새로운 First Responder 액션을 추가합니다. dummy: 라고 부르 자. 이제 텍스트 필드의 Did End On Exit 이벤트를 First Responder 프록시 객체의 dummy: 액션에 연결합니다. 그게 다야! 텍스트 필드의 종료시 끝나기 이벤트에 이제 작업 - 대상 쌍이 있으므로 사용자가 Return 키를 누르면 텍스트 필드가 자동으로 키보드를 닫습니다. 응답자 체인을 통해 전송 된 메시지에 대한 처리기를 찾지 못해서 벌금이 부과되지 않기 때문에 아무데도 아무 곳이나 구현하지 않아도 앱이 중단되지 않습니다.


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

예 :

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

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


프로그래밍 방식으로 UITextField 대리자를 신속하게 설정 3

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

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

UITextField 의 대리자를 ViewController 클래스로 설정했습니다.

이 클래스에서는 다음과 같이이 메서드를 구현했습니다.

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

Return 키를 사용하여 에디션을 끝내거나 백그라운드에서 터치 할 수있는 아주 깨끗한 방법입니다.

인터페이스 빌더에서 필드를 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: 메소드를 대체하여 주어진 필드에 대한 값이 올바르지 않으면 편집 종료를 피할 수 있습니다.

  • 필드에 인터페이스 작성기에서 설정된 대리자가 있으면 양식에서이를 변경하지 않습니다. 특정 필드에 다른 대표를 설정해야하는 이유는 많지 않지만 왜 그렇지는 않습니까?

이 폼 뷰 클래스를 향상시키는 데는 여러 가지 방법이 있습니다. - 델리게이트를 첨부하고, 레이아웃을 수행하고, 키보드가 필드를 다루는 (currentEditingTextField 프레임을 사용하여) 경우 핸들하고, 다음 필드의 에디션을 자동으로 시작합니다.

개인적으로 내 프레임 워크에 보관하고 기능을 추가하기 위해 항상 서브 클래 싱을 수행하면 "있는 그대로"유용하게 사용됩니다.

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


//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

textField.returnKeyType = UIReturnKeyDone;




uikeyboard