2015-02-02 2 views
0

UITextView를 사용하고 UITextViewDelegate를 View Controller에 연결했습니다. 사용자가 TextView를 클릭하면 텍스트보기 위에 텍스트가있는 지 여부에 따라 숨기거나 숨기기를 원하는 "자리 표시 자"레이블이 나타납니다. 그러나 UITextViewDelegate textViewDidBeginEditing 및 textViewDidEndEditing 메서드에서 UI 작업을 실행하는 데 문제가있는 것 같습니다. 단위 테스트에서 모든 것이 잘 실행되지만 앱을 실행할 때 UI가 업데이트되지 않습니다. 나는 심지어 UI 스레드를 강제로 dispatch_async 블록에서 UI를 래핑하는 시도했지만 느리고 변덕스럽게 보인다 (때로는 작동하지 않는 경우도있다). 다른 사람이 이것을 본 적이 있습니까? 나 앞에서 노골적으로 옳은 것을 놓치고 있니?iOS 8 UITextViewDelegate 및 UI 업데이트

public func textViewDidBeginEditing(textView: UITextView) { 
    switch(textView) { 
    case self.descriptionTextView: 
     self.activeTextView = self.descriptionTextView 
     break 
    case self.detailTextView: 
     self.activeTextView = self.detailTextView 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.detailsRequiredButton!.hidden = true 
     }) 

     break 
    default: 
     break 
    } 
} 
+0

텍스트 뷰어 내에 자리 표시 자 텍스트를 만드는 방법에 대한 답변을 확인하십시오. http://stackoverflow.com/questions/27652227/text-view-placeholder-swift – rakeshbs

+0

사실 그것이 내가 취한 첫 번째 접근 방식 (또는 적어도 그 파생)입니다. textFieldDidBeginEditing 및 textFieldDidEndEditing 중에 나타나는 일관성없는 호출은 동일한 문제를 발생시킵니다. 따라서 여기에있는 것처럼 버튼을 숨기지 않고 호출이 UI에 제대로 반영되지 않았기 때문에 자리 표시 자 텍스트가 지워지지 않습니다. – JamWils

답변

0

오히려 대리자 메서드를 사용하는 것보다, 나는 NSNotificationCenter 알림을 사용하여 훨씬 더 행운이 있었다. 나는 obj-c 코드를 공유 할 것이지만 Swift에서도 잘 작동 할 것입니다.

UITextView에 대해 _placeholderLabel이라는 별도의 UILabel으로 처리했습니다.

이것은 UITextView의 하위 클래스이지만 실제로는 UITextView의 콘텐츠/색을 변경하는 데는 효과가없는 이유는 없습니다. _placeholderLabel에있는 문자열의 범위를 확인해야하고 더 많은 로직이없고 누군가 해당 문자열을 실제로 입력하면 문제가 발생할 것입니다. 여기에 나와 있지 않은 실제 프로덕션 코드에 추가 코드가 있습니다. 이것이 textViewDidEndEditing:textViewDidChange:이 완전히 똑같은 이유입니다.

- (void)addObservers 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidEndEditing:) name:UITextViewTextDidEndEditingNotification object:self]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChange:) name:UITextViewTextDidChangeNotification object:self]; 
} 

- (void) removeObservers 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidEndEditingNotification object:self]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self]; 
} 

- (void) textViewDidEndEditing:(NSNotification *) notification 
{ 
    if ([notification object] == self) 
    { 
     _placeHolderLabel.hidden = ([[self text] length] > 0); 
    } 
} 

- (void) textViewDidChange:(NSNotification *) notification 
{ 
    if ([notification object] == self) 
    { 
     _placeHolderLabel.hidden = ([[self text] length] > 0); 
    } 
} 
+0

불행히도 알림 메서드에서 동일한 문제가 발생합니다. 델리게이트와 알림 메쏘드는 항상 호출되지만 UI는 여전히 제대로 업데이트되지 않습니다. 이것은 구현하기에 아주 간단해야합니다. Xcode에서 디버거를 살펴보면 메시지가 주 스레드에서 보내지는 것처럼 보입니다. 그래서 나는 당황합니다. – JamWils