基本上我想要实现的是让我的范围栏永远不会消失。
环境: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(@"%hhd@",controller.searchBar.hidden);
}
答案 0 :(得分:5)
您尝试的代码在iOS7以后将不起作用,因为Apple在返回正常视图时更改了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
}
答案 1 :(得分:0)
我有同样的问题。也许它在iOS7中发生了变化,因为显示范围栏应该是默认行为。您可以在以下教程的“创建可选范围栏以过滤结果”部分中进行验证:
http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view
希望有人为此提供解决方案;否则我们将不得不寻找一种解决方法。
答案 2 :(得分:0)
初始化设置范围栏NO
[self.searchBar setShowsScopeBar:NO];
[self.searchBar sizeToFit];
//default scope bar selection
self.searchBar.selectedScopeButtonIndex=3;
取消选中/删除scopeBar复选框中的勾号
答案 3 :(得分:0)
在没有自定义searchBar的情况下执行此操作是可能的(但是很困难),与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能够在不启动搜索表视图的情况下工作,对我而言,使用我自己的分段控件并将其添加到searchBar下的tableHeaderView更有意义。