2014-04-08 8 views
2

UITableViewUISearchBar이 있고 작동하지 않는 특정 요구 사항이 있습니다.키보드가 내려져 있고 x가 두드려 졌을 때 UISearchBar에서 작업 수행

UISearchBar (showsCancelButton = NO)에 취소 버튼이 없으므로 기존 검색을 취소하려면 UISearchBar 내의 x에 완전히 의존해야합니다. 키보드의 "검색"버튼을 사용하여 키보드를 닫습니다 (내 경우에는 완료라고 함).

사용자가 내 앱에서 검색 할 때 사용자 환경이 좋지 않아 navigation bar button 항목을 사용 중지하고 검색이 취소 된 경우에만 탐색 모음 버튼 항목이 다시 표시됩니다. 그게 다 효과적이야.

나는 하나의 특정 시나리오를 가지고 있지만 나는 주변에 있습니다. 키보드가 사임으로

1) x는 UISearchBar

에 남아) 키보드에서 완료를 클릭) 텍스트

2를 입력 검색 창에 탭과 키보드

3 사라집니다

4) UISearchBar에있는 x를 탭하면 SearchBar의 텍스트가 사라지고보기가 새로 고침니다.

5)이 시점에서 탐색 모음 버튼을 다시 활성화해야하지만 ' 안돼.

코드 :

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    self.timelineSearchBar.showsCancelButton = NO; 
    if ([searchText length] == 0) 
    { 
     [self.timelineSearchBar performSelector:@selector(resignFirstResponder) 
        withObject:nil 
        afterDelay:0]; 
    } 

나는 x가 잘되는 눌렀을 때 위의 코드는 키보드를 닫 의미하는 것을 알고있다.

필자의 경우 키보드가 이미 사임되었으므로 x를 두드리면 탐색 모음 항목이 다시 활성화됩니다.

self.addButton.enabled = YES; 

위의 if 문은 전혀 수행하지 않으며 탐색 모음 항목은 여전히 ​​사용 중지되어 있습니다.

나는 심지어 if 문에서 시도했다 :

[self.timelineSearchBar performSelector:@selector(enableAdd) 
        withObject:nil 
        afterDelay:0]; 

- (void)enableAdd 
{ 
    self.addButton.enabled = YES; 
} 

하지만 검색 창은 그 enableAdd 선택에 응답하지 않는 말을 충돌합니다.

나는 중단 점을 수행하고 위의 if 문이 x를 탭하면 문에 들어가서 단추를 활성화하는 코드를 "실행"하지만 실제로 발생하지는 않는지 확인합니다.

또한 내 최종 편집 방법은 다음과 같습니다

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    [searchBar setShowsCancelButton:NO animated:YES]; 
    self.addButton.enabled = YES; 
} 

업데이트 : 내가 성공하지 여기 http://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/ 링크를 시도했습니다 - 텍스트 필드의 shouldClear 메소드가 호출되지 않습니다. 나는 iOS 7을 사용하고 있습니다. 아마도 textFields로 뷰를 임베드하는 또 다른 방법이 있을까요? 이것은 아마도 올바른 접근 방식 일 수 있습니다. 그러나이 샘플의 for 문은 결코 사실로 평가되지 않기 때문에 코드와 함께 작동하지 않습니다 (NSLog에 넣었습니다).

UPDATE 2 : if 문 위에, 나는 searchBarCancelButton 방법이라고 나는 물론 그 올바른 접근이 없었다 극단적 인 루프가 발생되고 있었다 경우에서이에

[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0]; 

모든 지침 것 정말 고맙게 생각합니다. 나는 중요한 단계를 놓치고 있다는 것을 압니다.하지만 저는 그 사실을 정확히 알 수 없습니다. >searchBarShouldBeginEditing: - ->searchBarTextDidBeginEditing: ->searchBarTextDidEndEditing:

textDidChangesearchBar:textDidChange: :

+0

어디에서'addButton.enabled = NO'를 설정합니까? – michaels

+0

안녕 마이클, searchBarShouldBeginEditing 및 searchBarSearchButton에서 if ([self.timelineSearchBar.text length]> 0) 문을 사용하여 클릭하면 else가이 델리게이트 메소드에서 버튼을 다시 활성화합니다. 아니 그게 어디에 설정되어 있습니다 아니 – amitsbajaj

답변

3

문제는 X 버튼을 눌러 때, searchBar:textDidChange:가 호출 흐름searchBarShouldBeginEditing:

즉, 여기에 전에 이다라고이다 예를 설정 한 후, shouldBeginEditing은 다시 비활성화합니다.

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    self.addButton.enabled = NO; 
} 

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    if(searchBar.text.length == 0){ 
     self.addButton.enabled = YES; 
    } 
} 

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if ([searchText length] == 0) 
    { 
     [searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0]; 
    } 
} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    self.addButton.enabled = [searchBar.text length] == 0; 
    [searchBar resignFirstResponder]; 
} 
+0

많은 분들께 감사드립니다. @michaels - 정말 감사드립니다. 나는이 일을하기 위해 무엇을했는지에 대한 명확성을 위해 질문에 대답했지만, 당신의 의견 없이는 거기에 가지 않았을 것이고 나는 거의 당신의 코드를 작동 시켰을 것이다; 그냥 약간 조정해야했습니다. 도움을 주셔서 다시 한 번 감사 드리며 실제로 작업하기 위해 사용해야했던 접근 방식에 대한 생각을 얻는 데 정말로 관심이 있으실 것입니다. – amitsbajaj

0
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if([searchText length] == 0 && searchBar.text.length == 0) 
    { 
     self.addButton.enabled = YES; 
     [searchBar performSelector: @selector(resignFirstResponder) 
        withObject: nil 
        afterDelay: 0.1]; 
    } 
} 
+0

고마워 @ Goutham - 그게 도움이되지만 불행히도 그것은 같은 결과입니다. 키보드가 위로 올라가면 (isFirstResponder), 취소 버튼을 누르면 키보드가 사그라지고 탐색 바 버튼 (addButton)이 활성화됩니다. 그러나 키보드가 이미 resignFirstResponder 인 경우 UISearchBar의 x는 탐색 모음 단추 항목을 활성화하지 않습니다. 이것이 iOS의 버그인지 궁금합니다. – amitsbajaj

0

내가 명확성을 위해 여기에 대답을 만드는거야,하지만 난 내 코드가 작동 가지고 있지만 마이클스에 의해 대답은, 대규모 도움이 여기에 허용 된 접근 방식이 나를 위해 완벽하게 작동합니다.

NSLogs으로 많은 조사를했고 흥미롭게도 textDidChange (NSLogs 순) 앞에 shouldBeginEditing이 등장했음을 발견했습니다.

그러나 원래 질문의 단계에서 키보드가 사라지고 텍스트가있는 UISearchBar와 x가 표시된 경우 x를 두드리면 키보드가 나타나지 않지만 다시 shoudlBeginEditing이라고 알았습니다.

이 메서드는 버튼이 비활성화되도록 설정했기 때문에 addButton이 계속 회색으로 표시되도록하는 메서드였습니다. 나는 X가 취소 한 후 다시 검색 창에 가면 코드가 적절히 반응하도록 내가 거기에있는 경우 조건을 넣어

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar 
{ 
    NSLog(@"Should begin"); 
    if ([self.timelineSearchBar.text length] > 0) 
    { 
     self.addButton.enabled = NO; 
    } 
    else 
    { 
     self.addButton.enabled = YES; 
    } 
    self.timelineSearchBar.showsCancelButton = NO; 
    BOOL boolToReturn = self.shouldBeginEditing; 
    self.shouldBeginEditing = YES; 
    return boolToReturn; 
} 

:

그래서 나는 코드를 조정했다.

이렇게하면 키보드를 가져 오는 UISearchBar을 클릭하자마자 추가 버튼이 비활성화되지 않습니다. 그러나,에 (I는 입력되는 첫 번째 편지에서 호출되는 본 것입니다)를 textDidChange, 내가 너무 다음과 같은 조건을 넣어 : 나는 시작할 때

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    NSLog(@"Text did change"); 
    self.timelineSearchBar.showsCancelButton = NO; 
    if ([self.timelineSearchBar.text length] > 0) 
    { 
     self.addButton.enabled = NO; 
    } 
... 
} 

이 방법은 UISearchBar 만 추가 버튼을 표시 할 것 편지에 입력. 사용자가 UISearchBar을 두드리고 아무 입력도하지 않았기 때문에 Add 항목이 호출하는보기로 이동 한 prepareForSegue에 검색 바가 isFirstResponder인지 확인하고있는 경우 해당 항목이있는 경우 확인했습니다. 그렇다면 resignFirstResponder입니다.

이 점을 염두에두고, 이것이 Apple의 일을하는 방법인지는 확실하지 않지만 깨끗합니다. 내 앱이 이것 때문에 거부 당하면 곧 알게 되겠지만, 당신의 도움에 너무 감사드립니다. 당신은 정말로 내 전체 오후를 차지했던 문제에 대한 올바른 방향으로 나를 지적했습니다!

+0

만나서 반갑습니다! 나는 당신이 어떤 비공개 API를 사용하지 않거나 위험한 일을하지 않기 때문에 당신이 앱을 거부하게 될지 의심 스럽다. 'shouldBeginEditing'은'textDidChange' 전에 호출되는 것을 보았습니다. 제 편으로는 반대 결과를 얻었지만, 작동한다면 작동합니다! – michaels

+0

물론입니다! 혼란 스럽지만 작동하지만 행복합니다 :) 다시 감사합니다 - 정말로 감사드립니다! – amitsbajaj