UITextField를 편집할 때 키보드를 어떻게 닫나요?
-
07-07-2019 - |
문제
키보드를 닫고 싶을 때 첫 번째 응답자를 사임하도록 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];
}
이것이 작동하도록 하기 위해 내가 해야 할 일은 다음과 같습니다. 키보드용 숫자 패드가 있는 사람(또는 완료 버튼이 없는 다른 사람)에게 필요하다고 생각합니다.
- ViewController의 UIView를 UIControl로 변경했습니다.
나는라는 함수를 만들었습니다.
-(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>
대표단을 텍스트 필드에 할 수 없도록하십시오.
self.yourtextfield.delegate = self;
이 메소드를 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;