키보드를 제거하는 쉬운 방법?
저는 제 테이블의 많은 테이블 셀에 흩어져 있는 컨트롤들을 가지고 있습니다. 그리고 제 컨트롤들을 모두 반복하지 않고 키보드를 제거할 수 있는 더 쉬운 방법이 있는지 궁금했습니다. 그리고 제 컨트롤들을 모두 첫 번째 응답자로 사임할 필요가 없습니다.문제는..키보드에 대한 현재의 첫 번째 응답기를 가져오려면 어떻게 해야 합니까?
시도:
[self.view endEditing:YES];
중인 가 첫 하도록 할 수 .[view endEditing:YES]
키보드를 숨깁니다.
와는과 다르게 .-[UIResponder resignFirstResponder]
,-[UIView endEditing:]
하위 뷰를 검색하여 현재 첫 번째 응답자를 찾습니다.로 수 있습니다(예: 최예전수송있할다습니보로기위상따라서예:self.view
순식간에UIViewController
을 할 그리고 그것은 옳은 일을 할 것입니다.
(이 답변에는 이전에 몇 가지 다른 솔루션이 포함되어 있었는데, 이 솔루션도 효과가 있었지만 필요 이상으로 복잡했습니다.혼동을 피하기 위해 제거했습니다.)
응용 프로그램에 제로 대상 작업을 보낼 수 있습니다. 응용 프로그램은 현재 첫 번째 응답자 상태를 가진 보기에 대해 걱정할 필요 없이 언제든지 첫 번째 응답자를 사임합니다.
목표-C:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Swift 3.0:
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
Mac OS X에서는 메뉴 명령에 대해 NIL 대상 작업이 일반적이며 iOS에서는 다음과 같이 사용됩니다.
솔직히, 저는 여기서 제안된 어떤 해결책에도 열광하지 않습니다.문제의 핵심을 파악할 수 있는 TapGesture Recognizer를 사용할 수 있는 좋은 방법을 찾았습니다.키보드 이외의 항목을 클릭할 때는 키보드를 해제합니다.
ViewDidLoad에서 키보드 알림을 수신하고 UITapGesture Recognizer를 생성하려면 다음과 같이 등록합니다.
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:)];
응답기 표시/숨기기 키보드를 추가합니다.여기서 탭 제스처 인식기를 UIV 보기에 추가하거나 제거하여 탭 제스처 인식기를 누르면 키보드가 해제됩니다.참고: 모든 하위 보기 또는 컨트롤에 추가할 필요는 없습니다.
-(void) keyboardWillShow:(NSNotification *) note { [self.view addGestureRecognizer:tapRecognizer]; } -(void) keyboardWillHide:(NSNotification *) note { [self.view removeGestureRecognizer:tapRecognizer]; }
TapGesture Recognizer는 탭을 누르면 기능을 호출하며 다음과 같이 키보드를 해제할 수 있습니다.
-(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;
}
그고당이있텍필는상드관이없와자트치내마자가스리신▁and▁▁i▁asfield▁as▁soon치마▁hit자▁ir내.return
키보드에서, 그것은 기각됩니다!
당신의 경우, 모든 텍스트 필드의 대리자를 자신으로 설정하고 구현하는 한 동일하게 작동할 것입니다.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];
}
}
@니콜라스 라일리 & @켄달 헬름스테터 겔른 & @cannyboy:
정말 훌륭합니다!
감사해요.
당신의 조언과 이 스레드에 있는 다른 사람들의 조언을 고려하면, 제가 한 일은 다음과 같습니다.
사용할 때의 모습:
[[self appDelegate] dismissKeyboard];
(참고: NSObject에 appDelegate를 추가하여 어디서나 사용할 수 있습니다.)
후드 아래의 모습:
- (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
앱 전체에서 이러한 알림을 사용하는 경우 키보드 알림이 전송되지 않습니다.
사용자가 UI 텍스트 필드 또는 키보드 외부의 화면에서 아무 곳이나 터치할 때 iOS에서 키보드를 해제하는 방법에 대한 빠른 팁입니다.iOS 키보드가 차지할 수 있는 영역을 고려하면 사용자가 키보드를 제거할 수 있는 쉽고 직관적인 방법을 사용하는 것이 합리적입니다.
iOS 설명서에서 쉽게 찾을 수 없기 때문인지 여기에 지나치게 복잡한 답변이 많이 있습니다.Joseph H는 바로 위에 있었습니다.
[[view window] endEditing:YES];
제 코드에서 사용하는 것은 다음과 같습니다.그것은 매력적으로 작동합니다!
view controller.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];
}
Meagar의 대답보다 훨씬 더 간단합니다.
touchesBegan:withEvent:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[textField resignFirstResponder];`
}
은 이의입니다.dismiss the keyboard
당신이 어디든 만질 때.background
.
은 보주셔합다를 보내야 .endEditing:
래클작창의 하위 인 작업 UIView
[[UIApplication sharedApplication].windows.firstObject endEditing:NO];
UITableView 및 UIScrollView에서 키보드를 해제하는 가장 좋은 방법은 다음과 같습니다.
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
controller의 에 보기컨파헤추를 합니다.<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;
}
그런 다음 텍스트 상자를 실제 텍스트 필드에 연결합니다.
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
if (theTextField == yourTextBox) {
[theTextField resignFirstResponder];
}
return YES;
}
스위프트 3에서 당신은 다음을 할 수 있습니다.
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
제레미의 대답은 제게 별로 효과가 없었습니다. 탭 보기에 탐색 스택이 있고 그 위에 모달 대화 상자가 있습니다.저는 지금 다음을 사용하고 있고 저에게 효과가 있지만, 당신의 마일리지는 다를 수 있습니다.
// 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];
}
또한 UIViewController 비활성화를 재정의해야 할 수도 있습니다.경우에 따라 자동 키보드 해제 기능을 사용할 수 있습니다.이 작업은 UINavigation Controller(UINavigation Controller)가 있는 경우 수행해야 할 수 있습니다.
텍스트 필드 하위 분류...텍스트 보기도 있습니다.
하위 클래스에 이 코드를 입력합니다.
-(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];
}
준비 완료..이제 코드의 아무 곳에서나 알림을 게시하십시오.키보드를 다시 사용할 수 있습니다.
그리고 우리는 신속하게 할 수 있습니다.
UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)
키보드가 팝업된 후 키보드를 해제하려면 두 가지 경우가 있습니다.
UITextField가 UIScrollView 내부에 있는 경우
UITextField가 UIScrollView 외부에 있는 경우
2.UITextField가 UIScrollView 외부에 있는 경우 UIViewController 하위 클래스의 메서드를 재정의합니다.
또한 모든 UITextView에 대해 대리자를 추가해야 합니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
- 스크롤 보기에서 외부를 탭하면 이벤트가 발생하지 않으므로 이 경우 탭 제스처 인식기를 사용하여 스크롤 보기에 대한 UITapGesture를 드래그 앤 드롭하고 IBAaction을 만듭니다.
IBAction을 생성하려면 ctrl+를 누른 후 UITapGesture를 클릭하여 뷰 컨트롤러의 .h 파일로 끌어다 놓습니다.
여기서 탭된 이벤트를 작업 이름으로 지정했습니다.
- (IBAction)tappedEvent:(id)sender {
[self.view endEditing:YES]; }
위에 주어진 정보는 다음 링크에서 파생되었습니다. 자세한 정보는 참조하거나 위의 데이터를 이해하지 못할 경우 연락하십시오.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
저는 개인 API 호출을 사용하지 않고 키보드를 프로그래밍 방식으로 해제하는 "글로벌" 방법이 없다는 것이 싫습니다.첫 번째 응답자가 어떤 개체인지 알지 못하고 프로그래밍 방식으로 키보드를 해제해야 하는 경우가 많습니다.나는 그것을 조사하는 것에 의지해 왔습니다.self
Objective-C 런타임 API를 사용하여 모든 속성을 열거하고 유형의 속성을 추출합니다.UITextField
그리고 그들에게 보냅니다.resignFirstResponder
메세지.
이렇게 힘들진 않을 거예요
예쁘지는 않지만, 응답자가 무엇인지 모를 때 첫 번째 응답자를 사임하는 방식:
IB 또는 프로그래밍 방식으로 UITextField를 만듭니다.숨김으로 만듭니다.IB에서 만든 경우 코드에 연결합니다.그런 다음 키보드를 해제하려는 경우 응답자를 보이지 않는 텍스트 필드로 전환하고 즉시 종료합니다.
[self.invisibleField becomeFirstResponder];
[self.invisibleField resignFirstResponder];
하위 뷰를 통해 재귀적으로 반복하고 모든 UIT 텍스트 필드의 배열을 저장한 다음 이들을 반복하여 모두 재지정할 수 있습니다.
특히 하위 뷰가 많은 경우에는 그다지 좋은 솔루션은 아니지만, 간단한 앱의 경우에는 유용합니다.
저는 훨씬 더 복잡하지만 훨씬 더 성능이 좋은 방법으로 이 문제를 해결했습니다. 하지만 제 앱의 애니메이션 엔진에 싱글톤/매니저를 사용하고, 텍스트 필드가 응답자가 될 때마다 다른 특정 이벤트를 기준으로 스위프업(재설정)되는 정적에 할당했습니다.제가 단락에서 설명하는 것은 거의 불가능합니다.
창의적이 되십시오. 이 질문을 발견한 후 앱을 위해 이 문제를 곰곰이 생각하는 데 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
사퇴를 거부함).
탭 제스처 인식기를 보기에 추가합니다.그리고 그것의 금지를 정의합니다.
당신의 .m 파일은 다음과 같습니다.
- (IBAction)hideKeyboardGesture:(id)sender {
NSArray *windows = [UIApplication sharedApplication].windows;
for(UIWindow *window in windows) [window endEditing:true];
[[UIApplication sharedApplication].keyWindow endEditing:true];
}
저한테는 효과가 있어요.
예, endEditing이 가장 좋은 옵션입니다.그리고 iOS 7.0부터,UIScrollView
에는 스크롤 보기와 상호 작용할 때 키보드를 해제하는 멋진 기능이 있습니다.이를 위해 다음을 설정할 수 있습니다.keyboardDismissMode
의 UIScrollView
.
키보드 해제 모드를 다음과 같이 설정합니다.
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag
그것은 다른 종류가 거의 없습니다.이 사과 문서를 보세요.
신속하게:
self.view.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];
언급URL : https://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard
'programing' 카테고리의 다른 글
저장소 기본 클래스를 스프링 부트 자동 구성에 등록하는 방법이 있습니까? (0) | 2023.07.05 |
---|---|
Node.js에서 데이터베이스 관련 경합 조건 방지 (0) | 2023.07.05 |
Python 3에서는 부동소수점 값 4*0.1이 좋아 보이지만 3*0.1은 그렇지 않은 이유는 무엇입니까? (0) | 2023.07.05 |
논리 벡터에서 TRUE 값을 카운트하는 방법 (0) | 2023.07.05 |
다음에서 값으로다음에서 값으로타자기의 요소타자기의 요소 (0) | 2023.07.05 |