2009-07-10 11 views
3

Josh가 설명한 this question의 방법을 사용하여 iPhone 키보드 상단에 툴바를 추가했습니다. 기본적으로, 아이디어는 다음과 같습니다첫 번째 응답자 변경을 통해 iPhone 키보드 정렬 도구 모음을 계속 볼 수 있습니까?

  • 이와 함께 화면의 떨어져
  • 그 통지가 게시 될 때마다
  • , /에 도구 모음을 애니메이션 초기화 방법에 알림 UIKeyboardWillShowNotificationUIKeyboardWillHideNotification에 대한 관찰자로 뷰 컨트롤러를 추가 키보드

나는 또한 (사용자 중 하나가 텍스트 필드 떨어져 다른 텍스트 필드를 탭, 편집을 선택하고 편집이 완료되면 첫 번째로 반응을 사임 할 때 첫 번째로 반응을하게 모두 화면에 여러 UITextFields를하거나 키보드의 "완료"를 누르십시오 - 01이 있습니다.은 resignFirstResponder으로 바뀝니다.

텍스트 필드 사이를 전환 할 때마다 알림이 게시되므로 문제가 있습니다. 예를 들어, 사용자가 텍스트 필드 A를 편집 중일 때 텍스트 필드 B를 끝내면 A는 첫 번째 응답자를 사임하고 B는 첫 번째 응답자가됩니다. 그러나이 또한 내보기 컨트롤러에 "표시"및 "숨기기"알림을 게시합니다.

이 모든 결과는 도구 모음이 첫 번째 텍스트 필드에 대해 키보드와 함께 나타나고 마지막 텍스트 필드에 대해 키보드와 함께 사라지는 동안 도구 모음이 매번 키보드로 들어가거나 뒤로 빠져 나오는 것처럼 보입니다. 사용자가 텍스트 필드 사이를 전환합니다.

키보드가 인 경우 실제로는이 표시되거나 숨겨지는 경우에만 "will {show, hide}"알림에 응답하는 방법이 있습니까? 다시 말해, 키보드의 표시 상태가 변경되지 않는 알림을 무시하려면 어떻게해야합니까?

답변

4

키보드가 이미 표시되어 있는지 확인하려면 BOOL ivar를 만들어야하므로 모든 UITextField 대리자 메서드를 잘 활용할 수 있습니다. 여러 텍스트 필드가있는 도구 모음은 까다 롭지만 너는 아주 가깝다!

+0

내가 가지가 그 :) 덕분에 오지 않을 것 기대했다! – Tim

+0

그래, 고통 스럽다. 요즘에는 키보드 위쪽에 도구 모음이 제공되며 해킹을 중지하여 작동하도록 할 것입니다. –

4

Reed의 답변을 확인하려면 다음과 같이 구현했습니다. BOOL을 사용하여 컨트롤러가 textFieldShouldBeginEditing:textFieldDidBeginEditing: 메시지 사이에 있는지 여부를 추적하고 현재 편집중인 텍스트 필드를 추적하는 ivar를 추적합니다.

구현시 인터페이스에 적절한 속성 및 @synthesize 마커가있는 것으로 가정합니다. MyKeyboardToolbar는 UIToolbar의 하위 클래스이며 사용자 정의 된 이니셜 라이저를 사용하여 자체 버튼을 만듭니다.

BOOL shouldBeginEditing; 
UITextField *editingField; 
MyKeyboardToolbar *keyboardBar;

그리고 코드 자체 :

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // Give up first responder so the keyboard goes away 
    [textField resignFirstResponder]; 

    return YES; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = YES; 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = NO; 
    self.editingField = textField; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    // Do things here with the edited data (e.g. save it somewhere) 

    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    self.editingField = nil; 
} 

// These methods are added as the observers to the notification center 
- (void)keyboardWillShow:(NSNotification *)notification { 
    if(self.keyboardBar == nil) { 
     // Create and show the keyboard toolbar 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification { 
    if(![self shouldBeginEditing]) { 
     // Animate the bar off the screen, if necessary 

     // Remove and dispense of the bar entirely 
     [self.keyboardBar removeFromSuperview]; 
     self.keyboardBar = nil; 
    } 
} 

// This method's selector is given to the keyboard toolbar's Done button 
- (void)didPressKeyboardBarDoneButton { 
    [self.editingField resignFirstResponder]; 
}
+0

이 후속 조치를 게시 해 주셔서 감사합니다. 비슷한 상황에 처했을 때 도움이되었습니다. – Luke

관련 문제