2013-10-28 2 views
1

기본적으로 달성하려는 것은 스코프 바를 결코 사라지지 않게하는 것입니다.IOS7 : uisearchdisplaycontroller는 항상 스코프 바를 표시합니다.

환경 : 나는 "검색 창 및 디스플레이 컨트롤러 검색"이 별도의 tableview를보기 컨트롤러 내부 IOS 7, 스토리 보드,보기 controller.h

내부

(검색 창은 테이블에 있지) 보기 controller.m 내부

@property (nonatomic, strong) IBOutlet UISearchBar *candySearchBar; 

@synthesize candySearchBar; 

내가 시도하는 것 : 사용자 정의 검색 창 클래스 내부

- (void) setShowsScopeBar:(BOOL) showsScopeBar 
{ 
    if ([self showsScopeBar] != showsScopeBar) { 
     [super invalidateIntrinsicContentSize]; 
    } 
    [super setShowsScopeBar:showsScopeBar]; 

    [super setShowsScopeBar: YES]; // always show! 

    NSLog(@"setShowsScopeBar searchbar"); 
    NSLog(@"%hhd", showsScopeBar); 
} 

와 뷰 컨트롤러에서

searchBarDidEndEditing 

같은 것,하지만 난 내 질문에 분명하다 희망 다음

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [candySearchBar setShowsScopeBar:YES]; 
    [candySearchBar sizeToFit]; 
} 

, 나는 모든 인터넷을 통해 게시 된 많은 솔루션을 시도 대부분 setshowsscopebar에 대해 이야기하지만 작동하지 않는 것 같습니다. setshowscopebar의 로그 출력은 1이지만 스코프 바는 여전히 표시되지 않습니다.

나는 여전히 코드에 익숙하지 않은 것으로 간주되지만 오류는 여전히 초보자 실수 일 수 있습니다.

편집 : 뷰 컨트롤러 코드의 또 다른 조각, 당신은 내가 장님 찾고 있어요 볼 수 있습니다 :

-(void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{ 
    self.searchDisplayController.searchBar.showsCancelButton = YES; 
    self.searchDisplayController.searchBar.showsScopeBar = YES; 
    controller.searchBar.showsScopeBar = TRUE; 
    controller.searchBar.frame = CGRectMake(0, 149, 768, 88); 
    UIButton *cancelButton; 
    UIView *topView = self.searchDisplayController.searchBar.subviews[0]; 
    for (UIView *subView in topView.subviews) { 
     if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) { 
      cancelButton = (UIButton*)subView; 
     } 
    } 
    if (cancelButton) { 
     //Set the new title of the cancel button 
     [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal]; 
     [cancelButton setEnabled:YES]; 
     controller.searchBar.showsScopeBar = YES; 
     //candySearchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"Flags", @"Listeners", @"Stations", nil]; 
    } 
    NSLog(@"%@",NSStringFromCGRect(controller.searchBar.frame)); 
    NSLog(@"%@",NSStringFromCGRect(controller.searchBar.bounds)); 
    NSLog(@"%[email protected]",controller.searchBar.hidden); 
} 
+0

어디서 났습니까? 내가 찾은 솔루션은 iOS6에서만 작동합니다. 검색 막대를 클릭하면 스코프 바가 숨겨져 다시 나타납니다. – msec

+0

스토리 보드 또는 펜촉을 사용합니까 – codercat

+0

@msec은 ios7에 대한 답을 따르십시오. 고치다. – CoolMonster

답변

5

scopeBar 체크 박스에서 진드기를 제거 initialize가 일반보기로 돌아갈 때 범위를 숨 깁니다. 이 메소드를 사용자 정의 searchBar 클래스에 추가하십시오. 조건 경우에만 그 iOS7에

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    if([[UIDevice currentDevice].systemVersion floatValue]>=7.0) { 
     //Get search bar with scope bar to reappear after search keyboard is dismissed 
     [[[[self.subviews objectAtIndex:0] subviews] objectAtIndex:0] setHidden:NO]; 
     [self setShowsScopeBar:YES]; 
    } 
} 

직접이를 방지하기 때문에 iOS6의 사이 및 iOS7에 뷰 구조의 차이에 iOS6의 앱 충돌이 발생할 인덱스 객체를 액세스,이 내부를 추가한다.

은 또한 이것은 또한 사용자 지정 검색 창 클래스

-(void) setShowsScopeBar:(BOOL)showsScopeBar { 
    [super setShowsScopeBar:YES]; //Initially make search bar appear with scope bar 
} 
+0

감사합니다. !!! 코드를 가지고 놀아본 후 트릭은 한 줄의 코드를 주석 처리하고 나머지는 그대로 유지하는 것이 었습니다. 이렇게하면 원하는 결과가 반환됩니다. D – msec

+0

@msec 제 코드를 편집했습니다. 주석 처리 된 행을 단독으로 사용하는 것이 더 명확합니다. ios7에서만 라인이 작동하는지 확인하십시오. – CoolMonster

+0

나는 다시 편집했으나 여전히 검토를 거쳐야합니다. 필요한 코드 행 중 하나를 제거했고 if 문에 대해 빠진 대괄호를 삽입했습니다. 또한 다른 모든 필요한 코드를 추가했습니다. – msec

0

내가 같은 문제가 있습니다. 스코프 바를 보여주는 것이 기본 동작으로되어 있기 때문에 아마도 iOS7에서 변경된 부분 일 것입니다. 다음과 같은 튜토리얼의 "결과를 필터링 할 수있는 옵션 범위 바 만들기 "섹션에서이를 확인할 수 있습니다 :

http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view

희망 누군가가 이것에 대한 솔루션을 제공합니다; 그렇지 않으면 해결 방법을 찾아야합니다.

0

설정 범위를 줄 NO

[self.searchBar setShowsScopeBar:NO]; 
[self.searchBar sizeToFit]; 

//default scope bar selection 
self.searchBar.selectedScopeButtonIndex=3; 

의 선택을 해제/당신이 iOS7에 작동하지 않습니다 시도 코드는 사과 UISearchBar의 그것을 행동을 변경 이후 때문에

enter image description here

+0

이것이 작동하지 않는 것 같습니다. 이것이 스코프 바를 표시하고 검색을 취소 한 후에도 계속 표시되는지 확인하십시오. – msec

+0

번. 당신의 샘플 프로젝트를 드릴까요 – codercat

+0

당신은 당신의 searchDisplayControllerDidEndSearch를 엉망으로 만들었습니다. 실제로 원하는 것 또는 무엇을하려고했는지 – codercat

0

그것은 CoolMonster이 시사하는 것과 매우 유사한 방식으로, 사용자 정의 검색 창없이이 작업을 수행 할 수 있습니다 (하지만 해키)의 필요합니다. 당신의 TableViewController에서

, 검색 종료 후이가 ScopeBar 표시됩니다 :

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller 
{ 
    //Show the scopeBars 
    controller.searchBar.showsScopeBar = YES; 

    //Resize the searchBar to show ScopeBar 
    controller.searchBar.frame = CGRectMake(0, 0, 320, 88); 

    if([[UIDevice currentDevice].systemVersion floatValue]>=7.0) { 
     [[[[controller.searchBar.subviews objectAtIndex:0] subviews] objectAtIndex:0] setHidden:NO]; 
    } 
} 

을 그리고 당신은 아마 당신이 검색하기 전에 나타나는 TableViewController의 viewDidLoad에이 라인을 추가 할 수 있기 때문에, :

[self searchDisplayControllerDidEndSearch:self.searchDisplayController]; 

레코드를 얻으려면이 작업을 수행 한 후 위의 방법 대신 여러 가지 이유로 분할 된 컨트롤을 사용하십시오. 그 중 가장 중요한 것은 SearchBar의 ScopeBar를 터치하는 것입니다. 한 번 표시하면, 검색을 시작합니다. 당신이 그것을 권장되는 방법으로 사용한다면 의미가있는 tableView를 보여 주라. 그러나 ScopeBar가 검색 tableview를 시작하지 않고 작업하기를 원했기 때문에 나 자신 만의 세그먼트 화 된 컨트롤을 사용하여 searchBar 아래의 tableHeaderView에 추가하는 것이 더 적합했습니다.