내 테이블의 많은 테이블 셀에 상당히 많은 컨트롤이 흩어져 있으며 모든 컨트롤을 반복하고 첫 번째 응답자로 모두 사임하지 않고 키보드를 해제하는 더 쉬운 방법이 있는지 궁금합니다. 질문은 .. 키보드의 현재 첫 번째 응답자를 어떻게 얻습니까?
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
내 테이블의 많은 테이블 셀에 상당히 많은 컨트롤이 흩어져 있으며 모든 컨트롤을 반복하고 첫 번째 응답자로 모두 사임하지 않고 키보드를 해제하는 더 쉬운 방법이 있는지 궁금합니다. 질문은 .. 키보드의 현재 첫 번째 응답자를 어떻게 얻습니까?
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
답변:
시험:
[self.view endEditing:YES];
[self.view endEditing:YES];
Objective-C에서 BOOL 값이 YES / NO이므로
현재 편집중인보기가 첫 번째 응답자 상태를로 사임하도록 강제 할 수 있습니다 [view endEditing:YES]
. 키보드가 숨겨집니다.
달리 -[UIResponder resignFirstResponder]
, -[UIView endEditing:]
현재 첫 번째로 반응을 찾아 파단 통해 검색합니다. 따라서 최상위 뷰 (예 :) self.view
로 전송할 UIViewController
수 있으며 올바른 작업을 수행합니다.
(이 답변에는 이전에 작동했지만 필요한 것보다 더 복잡한 몇 가지 다른 솔루션이 포함되어 있습니다. 혼란을 피하기 위해 제거했습니다.)
[self.view endEditing:YES];
대답은 더 좋다.
[UIView endediting:]
은 작동 방식을 정확하게 설명 합니다. 애플 리케이션 중 하나에서 나는 그냥 호출하면 검색 상자가 UINavigationViewController에 첨가 개발 한 [self.view endEditing:YES]
대로, self
나는, 검색 상자가 추가 된 뷰 범위에서 직접이 방법이라고 예를 들어, 대신,보기 컨트롤러이하지 않습니다 일 : [self.mySearchBoxView endEditing:YES]
.
응용 프로그램에 대상이 지정되지 않은 작업을 보낼 수 있으며, 현재 첫 번째 응답자 상태를 가진 뷰에 대해 걱정할 필요없이 언제든지 첫 번째 응답자를 사임합니다.
목표 -C :
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
스위프트 3.0 :
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Mac OS X에서는 메뉴 명령으로 대상이 지정되지 않은 작업이 일반적이며, iOS에서 해당 작업이 사용됩니다.
솔직히 말해서, 여기에 제안 된 솔루션에 대해서는 미치지 않습니다. TapGestureRecognizer를 사용하여 문제의 핵심이라고 생각하는 좋은 방법을 찾았습니다. 키보드 이외의 것을 클릭하면 키보드를 닫습니다.
viewDidLoad에서 키보드 알림을 수신하고 UITapGestureRecognizer를 작성하도록 등록하십시오.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name:
UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name:
UIKeyboardWillHideNotification object:nil];
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(didTapAnywhere:)];
키보드 표시 / 숨기기 응답자를 추가하십시오. 여기에서 TapGestureRecognizer를 UIView에 추가하고 제거하면 탭할 때 키보드가 사라집니다. 참고 : 모든 하위 뷰 또는 컨트롤에 추가 할 필요는 없습니다.
-(void) keyboardWillShow:(NSNotification *) note {
[self.view addGestureRecognizer:tapRecognizer];
}
-(void) keyboardWillHide:(NSNotification *) note
{
[self.view removeGestureRecognizer:tapRecognizer];
}
TapGestureRecognizer는 탭을 받으면 함수를 호출하며 다음과 같이 키보드를 닫을 수 있습니다.
-(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {
[textField resignFirstResponder];
}
이 솔루션의 좋은 점은 스 와이프하지 않고 탭만 필터링한다는 것입니다. 따라서 키보드 위에서 내용을 스크롤하면 스 와이프해도 여전히 스크롤되어 키보드가 표시된 상태로 유지됩니다. 키보드가 사라진 후 제스처 인식기를 제거하면 나중에보기의 탭이 정상적으로 처리됩니다.
이것은 칠 때 키보드가 사라지도록하는 솔루션 return
입니다한 곳에서 코드를 추가하여 모든 텍스트 필드 치울 (따라서 각 텍스트 필드에 핸들러를 추가하지 않아도 됨).
이 시나리오를 고려하십시오.
나는 viewcontroller
두 텍스트 필드 (사용자 이름 및 암호)와 함께합니다. 그리고 viewcontroller
구현의 UITextFieldDelegate
프로토콜
viewDidLoad 에서이 작업을 수행합니다.
- (void)viewDidLoad
{
[super viewDidLoad];
username.delegate = self;
password.delegate = self;
}
뷰 컨트롤러는 다음과 같은 선택적 방법을 구현합니다.
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
내가 타 자마자 텍스트 필드에 관계없이 return
키보드 사라집니다!
귀하의 경우 모든 텍스트 필드의 대리자를 self로 설정하고 구현하는 한 동일하게 작동합니다. textFieldShouldReturn
더 나은 접근 방식은 무언가 "훔친"첫 번째 응답자 상태를 유지하는 것입니다.
UIApplication은 UIResponder의 서브 클래스이므로 다음을 시도 할 수 있습니다.
[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]
실패하면 크기가 0 인 프레임으로 새 UITextField를 만들고 어딘가에 뷰에 추가하고 비슷한 것을 수행하십시오 (사임이 됨).
유틸리티 클래스에서 이것을 제거하십시오.
+ (void)dismissKeyboard {
[self globalResignFirstResponder];
}
+ (void) globalResignFirstResponder {
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
for (UIView * view in [window subviews]){
[self globalResignFirstResponderRec:view];
}
}
+ (void) globalResignFirstResponderRec:(UIView*) view {
if ([view respondsToSelector:@selector(resignFirstResponder)]){
[view resignFirstResponder];
}
for (UIView * subview in [view subviews]){
[self globalResignFirstResponderRec:subview];
}
}
@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy :
절대적으로 훌륭합니다!
감사합니다.
이 스레드에서 당신의 조언과 다른 사람들의 조언을 고려할 때, 이것은 내가 한 일입니다.
사용될 때의 모습 :
[[self appDelegate] dismissKeyboard];
(참고 : appDelegate를 NSObject에 추가하여 어디서나 사용할 수 있습니다)
후드 아래의 모습 :
- (void)dismissKeyboard
{
UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
tempTextField.enabled = NO;
[myRootViewController.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
}
편집하다
에 대한 내 답변 수정 tempTextField.enabled = NO;
. 텍스트 필드를 사용 중지하면 앱 전체에서이 알림에 의존하는 경우 키보드 알림이 전송 되지 UIKeyboardWillShowNotification
않고 차단 UIKeyboardWillHideNotification
됩니다.
사용자가 UITextField 또는 키보드 외부 화면의 아무 곳이나 터치 할 때 iOS에서 키보드를 해제하는 방법에 대한 빠른 팁. iOS 키보드가 차지할 수있는 공간을 고려할 때 사용자가 키보드를 해제 할 수있는 쉽고 직관적 인 방법을 사용하는 것이 좋습니다.
여기 링크가 있습니다
Meagar의 답변보다 훨씬 간단
덮어 쓰기 touchesBegan:withEvent:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[textField resignFirstResponder];`
}
이 중 dismiss the keyboard
아무 곳이나 터치하면됩니다 background
.
내 코드에서 사용하는 내용은 다음과 같습니다. 그것은 매력처럼 작동합니다!
yourviewcontroller.h에서 다음을 추가하십시오.
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
이제 .m 파일에서 이것을 ViewDidLoad 함수에 추가하십시오.
- (void)viewDidLoad {
//Keyboard stuff
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
}
또한이 기능을 .m 파일에 추가하십시오.
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
뷰 컨트롤러의 헤더 파일 <UITextFieldDelegate>
에서 UITextField 델리게이트 프로토콜을 준수하도록 컨트롤러 인터페이스의 정의에 추가 하십시오 ...
@interface someViewController : UIViewController <UITextFieldDelegate>
... 컨트롤러의 구현 파일 (.m)에서 다음 메소드를 추가하거나 viewDidLoad 메소드가 이미있는 경우 그 내부의 코드를 추가하십시오.
- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
self.yourTextBox.delegate = self;
}
... 그런 다음 yourTextBox를 실제 텍스트 필드에 연결하십시오.
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
if (theTextField == yourTextBox) {
[theTextField resignFirstResponder];
}
return YES;
}
endEditing:
하위 클래스 인 작업 창으로 보내야 합니다.UIView
[[UIApplication sharedApplication].windows.firstObject endEditing:NO];
Jeremy의 답변이 저에게 효과적이지 않았습니다. 모달 대화 상자가있는 탭보기에 탐색 스택이 있었기 때문에 생각합니다. 나는 지금 다음을 사용하고 있으며 나를 위해 일하고 있지만 마일리지는 다를 수 있습니다.
// dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord
// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;
// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard { // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard
UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];
UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called. Probably is a way to determine this progragrammatically)
UIViewController *uivc;
if (myRootViewController.navigationController != nil) { // for when there is a nav stack
uivc = myRootViewController.navigationController;
} else {
uivc = myRootViewController;
}
if (uivc.modalViewController != nil) { // for when there is something modal
uivc = uivc.modalViewController;
}
[uivc.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
[tempTextField release];
}
텍스트 필드 서브 클래스 및 텍스트 뷰
서브 클래스 에서이 코드를 넣으십시오.
-(void)conformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}
-(void)deConformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self resignFirstResponder];
}
텍스트 필드 델리게이트에서 (텍스트 뷰 델리게이트와 유사)
-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
[textField conformsToKeyboardDismissNotification];
}
- (void)textFieldDidEndEditing:(JCPTextField *)textField{
[textField deConformsToKeyboardDismissNotification];
}
모든 설정 .. 이제 코드의 어느 곳에서나 알림을 게시하십시오. 모든 키보드를 사임합니다.
키보드가 나타난 후 키보드를 닫으려면 2 가지 경우가 있습니다 .
UITextField가 UIScrollView 안에 있을 때
UITextField가 UIScrollView 외부에 있을 때
2. UITextField가 UIScrollView 외부에있을 때 UIViewController 서브 클래스의 메소드를 대체하십시오.
모든 UITextView에 대리자를 추가 해야합니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
IBAction을 만들려면 ctrl +를 누르고 UITapGesture를 클릭하고 viewcontroller의 .h 파일로 끕니다.
여기에서 tappedEvent를 내 액션 이름으로 지정했습니다.
- (IBAction)tappedEvent:(id)sender {
[self.view endEditing:YES]; }
주어진 abouve는 다음 링크에서 파생되었습니다. abouve 데이터를 이해하지 못하는 경우 자세한 정보를 참조하거나 저에게 연락하십시오.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
하위 뷰를 반복적으로 반복하고 모든 UITextField의 배열을 저장 한 다음 반복하여 사임 할 수 있습니다.
특히 훌륭한 서브 뷰가있는 경우에는 훌륭한 솔루션은 아니지만 간단한 앱의 경우 트릭을 수행해야합니다.
나는 이것을 훨씬 더 복잡하지만 성능이 더 좋은 방법으로 해결했지만 내 응용 프로그램의 애니메이션 엔진에 싱글 톤 / 관리자를 사용하고 텍스트 필드가 응답자가 될 때마다 정적 인 할당을 할당 할 것입니다. 다른 특정 사건에 근거하여 휩쓸려 (사임) ... 단락에서 설명하기가 거의 불가능합니다.
창의력을 발휘하십시오.이 질문을 찾은 후 내 앱에 대해 생각하는 데 10 분 밖에 걸리지 않았습니다.
최근에 사용해야했던 약간 더 강력한 방법 :
- (void) dismissKeyboard {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in windows) [window endEditing:true];
// Or if you're only working with one UIWindow:
[[UIApplication sharedApplication].keyWindow endEditing:true];
}
다른 "전역"방법 중 일부가 작동하지 않는 것을 발견했습니다 (예 : UIWebView
& WKWebView
사임 거부).
보기에 Tap Gesture Recognizer를 추가하고 ibaction을 정의하십시오
.m 파일은
- (IBAction)hideKeyboardGesture:(id)sender {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in windows) [window endEditing:true];
[[UIApplication sharedApplication].keyWindow endEditing:true];
}
그것은 나를 위해 일했다
쉬운 방법은 메소드를 호출하는 것입니다
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if(![txtfld resignFirstResponder])
{
[txtfld resignFirstResponder];
}
else
{
}
[super touchesBegan:touches withEvent:event];
}
이 방법 중 하나를 사용해야합니다.
[self.view endEditing:YES];
또는
[self.textField resignFirstResponder];