programing

모달 View Controller 프레젠테이션 스타일이 UIModal Presentation FormSheet인 경우 iPad 키보드가 꺼지지 않습니다.

muds 2023. 4. 16. 15:54
반응형

모달 View Controller 프레젠테이션 스타일이 UIModal Presentation FormSheet인 경우 iPad 키보드가 꺼지지 않습니다.

주의:

iOS 4.3 이후의 솔루션에 대해서는, 승인된 답변(상위 투표가 아닌 답변)을 참조해 주세요.

질문은 iPad 키보드에서 발견된 동작에 대한 것입니다. iPad 키보드는 내비게이션 컨트롤러가 있는 모달 대화 상자에 표시될 경우 삭제되지 않습니다.

기본적으로 Navigation Controller에 다음과 같은 행을 표시합니다.

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

키보드가 꺼지지 않는다.이 줄에 댓글을 달면 키보드가 잘 지워져요.

...

사용자 이름과 비밀번호라는2개의 텍스트필드가 있습니다.username에는 [Next]버튼이 있고 password에는 [Done]버튼이 있습니다.이것을 모달 네비게이션 컨트롤러에 표시해도 키보드가 없어지지 않는다.

작동하다

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];

동작하지 않다

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
[[UINavigationController alloc]
 initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

네비게이션 컨트롤러 부품을 제거하고 'b'를 모드 뷰 컨트롤러로 표시하면 동작합니다.내비게이션 컨트롤러가 문제입니까?

작동하다

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];

작동하다

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc]
         initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

이것은, Apple의 엔지니어에 의해서 「의도대로 동작한다」라고 분류되고 있습니다.얼마 전에 버그를 신청했어요.그 이유는 사용자가 종종 모달 형태로 데이터를 입력하기 때문에 사용자가 "도움이 되고" 일반적으로 모달 뷰 내에서 다양한 전환으로 인해 키보드가 반복적으로 표시/숨겨질 수 있는 곳에 키보드를 계속 보이게 하려고 하기 때문입니다.

edit: 다음은 개발자 포럼에 올라온 Apple 엔지니어의 답변입니다.

혹시 UIModal Presentation FormSheet 스타일로 표시되었습니까?빈번한 인앤아웃 애니메이션을 피하기 위해 최초 응답자가 없는 경우에도 키보드가 화면에 남아 있을 수 있습니다.이것은 버그가 아닙니다.

이것은 많은 사람들에게 문제를 주고 있지만(나 자신도 포함), 현재로서는 해결할 방법이 없는 것 같습니다.

갱신:

iOS 4.3 이후에서는, 「-disables」를 실장할 수 있게 되었습니다.뷰 컨트롤러의 AutomaticKeyboardDismissal'을 눌러 NO를 반환합니다.

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

이것으로 문제가 해결됩니다.

에 모달(모달)을 .UINavigationController'어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어, 어.disablesAutomaticKeyboardDismissal뷰 컨트롤러가 아닌 네비게이션 컨트롤러에 있습니다.이치노

파일: UINavigation Controller + KeyboardDismiss.h

#import <Foundation/Foundation.h>

@interface UINavigationController (KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal;

@end

파일: UINavigation Controller + KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h"

@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end

UINavigationController를 사용하는 파일의 카테고리를 Import하는 것을 잊지 마십시오.

되는 뷰 「」를 만 하면 .disablesAutomaticKeyboardDismissalNO:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

는 이문 the the the를 했습니다.UIModalPresentationPageSheet프레젠테이션 스타일과 사이즈를 조정합니다.다음과 같이 합니다.

viewController.modalPresentationStyle = UIModalPresentationPageSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
viewController.view.superview.autoresizingMask = 
    UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleBottomMargin;    
viewController.view.superview.frame = CGRectMake(
    viewController.view.superview.frame.origin.x,
    viewController.view.superview.frame.origin.y,
    540.0f,
    529.0f
);
viewController.view.superview.center = self.view.center;
[viewController release];

다른 모달 디스플레이를 전환하면 키보드가 사라집니다.예쁘지도 않고, 애니메이션도 안 되지만, 없애버릴 수 있어요.

해결 방법이 있다면 좋겠지만, 지금으로서는 이 방법이 효과가 있습니다., .UIViewController키보드가 없어지고 싶을 때 호출할 수 있습니다.

@interface _TempUIVC : UIViewController
@end

@implementation _TempUIVC
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

@implementation UIViewController (Helpers)

- (void)_dismissModalViewController {
    [self dismissModalViewControllerAnimated:NO];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [self release];
}

- (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated {
    [self retain];
    _TempUIVC *tuivc = [[_TempUIVC alloc] init];
    tuivc.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:tuivc animated:animated];
    if (animated) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil];
    } else
        [self _dismissModalViewController];
    [tuivc release];
}

@end

단, viewDidAppear / viewDidDisapple 및 모든 메서드가 호출되므로 주의해 주십시오.말했듯이, 예쁘지는 않지만 효과가 있어요.

-아담

관용구를 확인하는 것만으로 범용 앱에서도 조작할 수 있습니다.아이패드라면 키보드가 자동으로 뜨지 않고 사용자가 편집하고 싶은 것을 탭 할 수 있습니다.

가장 좋은 솔루션은 아니지만 매우 간단하며 다음 주요 iOS 릴리즈에서 중단될 고급 해킹은 필요하지 않습니다.

다음 코드를 viewWillDisplay에 넣습니다.현재 컨트롤러의 방법도 이 문제를 해결하는 다른 방법입니다.

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");
id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];
[activeInstance performSelector:@selector(dismissKeyboard)];

.disablesAutomaticKeyboardDismissal " " " 를 추가합니다.disablesAutomaticKeyboardDismissal하지 않았습니다.UITextField모달 대화 상자에서.

화면상의 키보드가 좀처럼 없어지지 않았다.

저의 솔루션은 대화 상자의 모든 텍스트 입력 컨트롤을 비활성화한 후 몇 초 후에 관련 컨트롤을 다시 활성화하는 이었습니다.

가 아무것도 않는 것 .UITextField컨트롤이 활성화되어 있으면 키보드가 제거됩니다.

확인하셨겠지만 컨트롤러 클래스가 UITextField 대리인으로 올바르게 연결되어 있는 것은 확실합니다.

'아니오'를 반환하지 않을 수도 있지만, 그렇습니다.그래서 없어질 수 있어요.

당신은 ★★★★★★★★★★★★★★★★★★★★★★★.textFieldShouldEndEditingYES yes를 yes ★★★★★★★★★★★★★★★★★★★★★★?

그리고 해고해? [nextResponder becomeFirstResponder]?! 미안 이제 알겠다

또, 「편집 가능한」속성이 FALSE로 설정되어 있는 UITextView도 다수 있습니다.

그 중에 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.tag의 가치secondField.tag+1그렇다면 응급구조대원을 그만두지 말고 응급구조대원이 되라고 하는 거군요이 if 구조체에 NSLog()를 넣을 수 있습니다.

UINavigation Controller에 문제가 있는 사용자는 다음 URL에서 유사한 질문에 대한 답변을 참조하십시오.https://stackoverflow.com/a/10507689/321785

편집: Miha Hribar의 솔루션(결정이 필요한 곳에서 이루어졌기 때문에)을 개선한 것으로 간주하며, UIView Controller의 카테고리에 관한 Pascal의 코멘트와는 반대입니다.

완벽한 해결책은 아닐지 모르지만, 효과가 있다.
[ self . view end ]편집:네];
버튼이나 제스처가 실장되어 있는 장소로부터, 모달의 표시까지

Swift 4.1:
extension UINavigationController {
   override open var disablesAutomaticKeyboardDismissal: Bool {
      return false
   }
}

언급URL : https://stackoverflow.com/questions/3372333/ipad-keyboard-will-not-dismiss-if-modal-viewcontroller-presentation-style-is-uim

반응형