2013-10-28 49 views
1

基本上我試圖實現的是讓我的範圍欄永遠不會消失。IOS7:uisearchdisplaycontroller總是顯示範圍欄

環境:IOS 7,情節串連圖板,一個視圖控制器內我有一個「搜索欄和搜索顯示控制器」和一個單獨的tableview(搜索欄不表裏面)

裏面的視圖或者Controller.h

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

裏面的觀點Controller.m或者

@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

你試過不會iOS7工作的代碼以後,因爲蘋果已經改變了它的行爲UISearchBar在返回到正常視圖時隱藏範圍。將此方法添加到您的自定義searchBar類中。

-(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的,因爲在iOS6的和iOS7之間視圖層次差的,以避免這種情況,只有當其iOS7如果條件添加這裏面。

此外,這還需要在自定義搜索欄類

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

Thankyou!在玩了一段代碼之後,訣竅是取消註釋一行代碼並保留其餘部分。這返回了所需的結果:D – msec

+0

@msec好吧,我編輯了我的代碼。單獨使用註釋行更清晰。確保該行只能在ios7中運行。 – CoolMonster

+0

我再次編輯,但它仍然需要審查。您刪除了必需的代碼行之一,我還插入了if語句缺失的括號。此外,我添加了所有其他必要的代碼 – msec

0

從scopeBar複選框初始化設定範圍欄中沒有

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

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

取消選擇/刪除剔

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中更有意義。