2010-08-16 4 views
4

나는 내 자신으로 키보드를 오버레이하기 위해 트릭을 사용하고 있습니다. 기본적으로 키보드에 Subview로 일부 버튼을 추가합니다.iPhone, iPhone 3.2 또는 그 이상에서 키보드 UIView를 사용하는 방법

UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; 
UIView* keyboard; 
for(UIView* potentialKeyboard in tempWindow.subviews) 
    // if the real keyboard-view is found, remember it. 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) { 
     if([[potentialKeyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) 
      keyboard = potentialKeyboard; 
     } 
     else { 
      if([[potentialKeyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
       keyboard = potentialKeyboard; 
    } 

이 방법은 UIKeyboardDidShowNotification에 의해 호출된다 : 이것은 내가 키보드의 UIView의를 찾는 방법입니다. 차라리 UIKeyboardWillShowNotification에 의해 호출 될 것입니다. 왜냐하면 "Did"버전은 원래의 키보드가 사용자에게 보여지기 때문에 보여줍니다. 그러나 위와 동일한 절차를 사용하면 EXC_BAD_ACCESS 오류가 발생합니다. 분명히 키보드의보기가 제대로 발견되지 않습니다.

이제 내 질문 : UIKeyboardWillShowNotification이 실행될 때 키보드의 UIView에 액세스 할 수있는 방법이 있습니까?

미리 감사

답변

3

에 나는 단순히이 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];

- (void)keyboardWillShow { [self performSelector:@selector(addHideKeyboardButtonToKeyboard) withObject:nil afterDelay:0]; }

을 사용 덧붙였다.

키보드가 나타날 때 호출됩니다.

+0

비록 이것이 문제를 일으킬 수 있다는 느낌을 받았지만 작동했습니다. 그것은 단지 감정이지만, 지연이라고 생각합니다 : 0은 셀렉터를 너무 빠르게 호출 할 수 있습니다 ...하지만 잘 작동합니다. 결국 양쪽 모두를 사용해야했습니다 : keyboardWillShow가 지연되어 키보드가 겹쳐서 표시되고 keyboardDidShow가 그대로 유지됩니다. 보기가 완전히로드되면 어떻게 든 오버레이가 사라집니다. 하지만 어쨌든 작동합니다. 감사. – Bujtor

+0

performSelector : afterDelay를 사용할 때 : 메인 스레드가 호출을 처리 중이고 uikeyboard 애니메이션이 메인 스레드에 의해 호출되기 때문에 완료 될 때까지 기다려야합니다. performSelector : afterDelay : – Simon