2009-05-29 7 views
35

내 인터페이스에 UISearchBar가 있는데 일부 텍스트를 입력 한 후 검색 창에 나타나는 작은 지우기 버튼의 동작을 사용자 정의하고 싶습니다 (십자 기호가있는 작은 회색 원에 검색 필드의 오른쪽).UISearchBar의 지우기 버튼에 연결할 수 있습니까?

기본적으로 검색 표시 줄 (기본 구현)의 텍스트를 지우는 것이 아니라 내 인터페이스의 일부 내용을 지우고 내 방식 중 하나를 호출하기를 원합니다.

UISearchBar 클래스 또는 UISearchBarDelegate 프로토콜에 대한 문서에서 아무 것도 찾을 수 없습니다.이 동작에 직접 액세스 할 수있는 것처럼 보이지 않습니다.

내가 참고 한 한 것은 문서가 대리자 메서드 설명했다이었다 : 맑은 버튼을 탭 후

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText; 

가 호출됩니다.

처음에는 검색 막대의 텍스트 속성을 검사 한 코드에 쓴 코드가 비어 있으면 지워졌고 다른 모든 것들을 수행했습니다.

첫째, 어떤 이유로 나는, 내 방법, 뭔가의 끝에서 resignFirstResponder 검색 창을 말하더라도, 추측 할 수없는 어딘가에 다시 becomeFirstResponder로 설정되어이 비록

두 문제. 정말 성가신 ...

둘째, 사용자가 지우기 단추를 사용하지 않고 키보드의 삭제 단추를 사용하여 바에서 텍스트를 삭제하면이 방법은 실행되지 않고 검색 결과가 사라집니다. 안좋다.

올바른 방향으로 조언이나 조언을 구하십시오.

감사합니다.

답변

11

대답은 올바르지 않습니다 차이가 나는 '라이브 서치'를 지원하지만, 대신에 사용자가 키보드의 검색 버튼을 터치 할 때 검색을 시작하지 않는다는 것입니다. 내가 볼 수있는 문제는 정말 적절하지 않았다이 처음 등장하기 때문에

UISearchbar clearButton forces the keyboard to appear

최저

1

UITextField의 rightViewrightViewMode 방법을 사용하여 동일한 이미지를 사용하는 자신 만의 지우기 단추를 만드는 것이 좋습니다. 물론 UISearchBar를 사용하면 UITextField에 액세스 할 수 있습니다. 나는 그렇게 할 것이라고 생각한다.
아이폰 OS 레퍼런스 라이브러리에서이 유의하십시오

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

그래서 당신은 아마도 원래의 지우기 버튼을 해제해야합니다.

+1

은 내가 UISearchBar가 ...이 texfield의 I는이 답변에 동의 – Jasarien

7

내 응용 프로그램에이 코드가 있습니다. 받아 들여졌다

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    if ([searchBar.text isEqualToString:@""]) { 
     //Clear stuff here 
    } 
} 
+0

+1을 노출하지 않습니다 확신 해요. 텍스트가 비어있는 경우 지워진 후에는 지우기 버튼을 눌렀 음을 의미합니다. @Jasarien 솔루션을 찾았습니까? – JoePasq

+0

Surley 사용 - (void) searchBar : (UISearchBar *) searchBar textDidChange : (NSString *) searchText 대신에 처음 응답자를 사임해야하는 경우 사용자가 상자를 선택할 수 없습니다. 시작하면 빈 상태가됩니다. – Marc

1

, 그리고 지금까지이 수행 할 수 있습니다, 난 그냥 알아 낸 또 다른 질문을 게시 나는 해결책을 게시 할 것이라고 생각했다.

1) searchBar 에있는 textField에 대한 참조를 가져와야합니다. 2) 해당 텍스트 필드가 실행될 때 해당 텍스트 필드를 잡아야합니다.

이것은 매우 간단합니다. 한 가지 방법이 있습니다.

a) searchBar 내에서 textField의 대리자 메서드를 사용하므로 클래스를 만들어야합니다. b) 검색 바를 수업의 Outlet에 연결하십시오. 방금 내 검색 바라고 했어. c) viewDidLoad에서 searchBar 내에서 textField를 가져 오려고합니다. 나는 이것을 좋아했다.

UITextField *textField = [self.searchBar valueForKey:@"_searchField"]; 
if (textField) { 
    textField.delegate = self; 
    textField.tag = 1000; 
} 

공지 사항, 나는 그것을 다시 잡을 수 있도록 태그를 textField에 할당했으며 textField 대리인으로 만들었습니다. 당신은 속성을 생성하고이 textField를 그 속성에 할당하여 나중에 가져올 수 있었지만 태그를 사용했습니다.

-(BOOL)textFieldShouldClear:(UITextField *)textField { 
if (textField.tag == 1000) { 
    // do something 
    return YES; 
} 
return NO; 

}

다야 : 여기에서

은 그냥 대리자 메서드를 호출해야합니다. 개인 ValueForKey를 언급하고 있기 때문에 문제가 발생하지 않을 것이라고 보장 할 수는 없습니다.

+1

정말 고마워. – SampathKumar

0
내 경험에서

최선의 해결책을 찾을이 문제에 대한 더 나은 솔루션을 IBAction를

- (IBAction)searchCancelButtonPressed:(id)sender { 

    [self.searchBar resignFirstResponder]; 
    self.searchBar.text = @""; 

    // some of my stuff 
    self.model.fastSearchText = nil; 
    [self.model fetchData]; 
    [self reloadTableViewAnimated:NO]; 

} 
17

을 시스템 지우기 버튼 위 (분명 배경 및 텍스트가없는)가있는 UIButton을 넣어보다 연결을 그냥 :)

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

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
} 
+0

Tnx 좋은 트릭, 아래에 답변으로 Swift 2 버전을 추가했습니다. – ergunkocak

1

이 작업을 시도 할 수 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (UIView *view in searchBar.subviews){ 
     for (UITextField *tf in view.subviews) { 
      if ([tf isKindOfClass: [UITextField class]]) { 
       tf.delegate = self; 
       break; 
      } 
     } 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 
    // your code 
    return YES; 
} 
+2

Swift 2를 사용하는 iOS 9에서는 작동하지 않습니다. '_searchController] 오류로 인해 충돌합니다 : 인식 할 수없는 선택기가' – Sunkas

0

는 지느러미 할 수 없습니다 개인용 API를 사용하지 않았거나 업그레이드가되지 않은 해결책은 Apple이 UISearchBar의보기 구조를 변경하는 경우입니다.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITextField* textfield = [self findTextFieldInside:self.searchBar]; 
    [textfield setDelegate:self]; 
} 

- (UITextField*)findTextFieldInside:(id)mainView { 
    for (id view in [mainView subviews]) { 
     if ([view isKindOfClass:[UITextField class]]) { 
      return view; 
     } 

     id subview = [self findTextFieldInside:view]; 
     if (subview != nil) { 
      return subview; 
     } 
    } 

    return nil; 
} 

그런 다음 클래스에 UITextFieldDelegate 프로토콜을 구현하고 textFieldShouldClear 덮어 쓰기 : : 방법을 여기에 내가 작품을 쓴 것입니다.

- (BOOL)textFieldShouldClear:(UITextField*)textField { 
    // Put your code in here. 
    return YES; 
} 

편집 : 크래시를 생성합니다 iOS8의에서 검색 표시 줄의 텍스트 필드에 대리자를 설정. 그러나 searchBar : textDidChange : 메서드는 iOS8에서 명확하게 호출됩니다. 클리어 버튼 클릭에 가까운 키보드를 만지

6

스위프트 버전 :

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchText.characters.count == 0 { 
     performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0) 
    } 
} 

func hideKeyboardWithSearchBar(bar:UISearchBar) { 
    bar.resignFirstResponder() 
} 
관련 문제