IOS7:uisearchdisplaycontroller 总是显示范围栏
Posted
技术标签:
【中文标题】IOS7:uisearchdisplaycontroller 总是显示范围栏【英文标题】:IOS7 : uisearchdisplaycontroller always show scope bar 【发布时间】:2013-10-28 15:04:01 【问题描述】:基本上我想要实现的是让我的范围栏永远不会消失。
环境:ios 7,情节提要,在视图控制器内我有一个“搜索栏和搜索显示控制器”和一个单独的表格视图(搜索栏不在表格内)
在视图控制器.h内部
@property (nonatomic, strong) IBOutlet UISearchBar *candySearchBar;
在view 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中log的输出是1,但是scopebar还是没有显示出来。
我仍然认为自己是代码新手,错误仍然可能是新手错误。
编辑:视图控制器中的另一段代码,如您所见,我正在盲目搜索:
-(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(@"%hhd@",controller.searchBar.hidden);
【问题讨论】:
你在这方面有什么收获吗?我发现的解决方案仅适用于 iOS6,当我单击搜索栏时,范围栏会被隐藏,我不知道如何让它重新出现 你用storyboard还是nib @msec 关注我对 ios7 修复的回答。 【参考方案1】:您尝试的代码在 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和iOS7的视图层次不同,直接访问索引处的对象可能会导致应用程序在iOS6中崩溃,为避免这种情况,只有在iOS7时才在if条件中添加。
此外,自定义搜索栏类中也需要这样做
-(void) setShowsScopeBar:(BOOL)showsScopeBar
[super setShowsScopeBar:YES]; //Initially make search bar appear with scope bar
【讨论】:
谢谢!!!在玩了一点代码之后,诀窍是取消注释一行代码并维护其余代码。这返回了所需的结果:D @msec 好的,我对我的代码进行了编辑。单独使用注释行更清楚。确保该行仅适用于 ios7。 我再次编辑,但仍需审核。您删除了所需的代码行之一,我还插入了 if 语句缺少的括号。此外,我添加了所有其他必要的代码 @msec 我认为最好将问题状态清楚地显示为范围栏,而不是您所做的所有其他编辑对于这个问题都是不必要的。 @msec 不需要那条线 man。你能在没有那条线的情况下检查一下吗【参考方案2】:我也有同样的问题。也许它在 iOS7 中发生了变化,因为显示范围栏应该是默认行为。您可以在以下教程的“创建可选范围栏以过滤结果”部分中验证这一点:
http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view
希望有人对此有解决方案;否则我们将不得不寻找解决方法。
【讨论】:
【参考方案3】:初始化设置范围栏 NO
[self.searchBar setShowsScopeBar:NO];
[self.searchBar sizeToFit];
//default scope bar selection
self.searchBar.selectedScopeButtonIndex=3;
从 scopeBar 复选框中取消选择/删除勾选
【讨论】:
这似乎不起作用,您确定这将显示范围栏并在取消搜索后仍保持显示? 你搞砸了你的 searchDisplayControllerDidEndSearch。实际上你想要什么或你试图做什么 如果你能给我一个示例项目,我将不胜感激,我已经用各种方法尝试过你的代码,但似乎无法让它按照我想要的方式工作。如果这有什么不同,我会同时使用标签和导航栏 xib @iDev,我能够通过继承 UISearchBar 并使用此代码- (void) setShowsScopeBar:(BOOL)showsScopeBar [super setShowsScopeBar:YES]; //Always show scope bar
使其首先出现,但这仅在我激活搜索栏之前有效。一旦我清除搜索,范围栏就会被隐藏,我似乎无法找回它
github.com/iDevandroid/TestSearchDisplayController这个故事板如果你想完全从xib告诉我【参考方案4】:
在没有自定义搜索栏的情况下也可以(但很笨拙)这样做,这与 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 更有意义。
【讨论】:
以上是关于IOS7:uisearchdisplaycontroller 总是显示范围栏的主要内容,如果未能解决你的问题,请参考以下文章