2015-06-17 177 views
0

我想直接添加搜索到我的导航栏(如Apple地图)。导航栏搜索结果

enter image description here

所以这就是没有问题,不适只是创建为搜索栏:

searchBar.placeholder = "Gebäude und Räume suchen" 
    var rightNavBarButton = UIBarButtonItem(customView: searchBar) 
    self.navigationItem.rightBarButtonItem = rightNavBarButton 

但我应该怎么解决才能看到效果?第一个病人尝试使用Adaptive Popover,如果用户输入至少2个字母,则会加载弹出窗口并显示结果(这样我可以在iPad上显示弹出窗口,并在iPhone上获得全屏视图) - 但在这里我需要检查每个按键,如果弹出窗口仍然可见,并且如果有一个自适应弹出窗口,我需要在子控制器上创建搜索栏。

所以我不知道如何解决像苹果地图(iPhone和iPad版本)这样的事情 - 任何人都可以给我一些tipps我该怎么做?这是一个Popover吗?自定义视图?

任何帮助将不胜感激。

编辑:

最简单的方法(这就是它的ATM的样子) - 我有一个搜索图标的按钮,如果用户点击这个搜索按钮,生病负载的“搜索”控制器(与一个搜索栏) - 如果用户点击一个结果虐待“返回”,并显示在地图上的结果。

但我宁愿让它像苹果地图应用(与iPad和iPhone版本之间的差异)

+0

您是否实现了searchDisplayController? 您可以将该控制器设置为:displaysSearchBarInNavigationBar这会使事情变得更容易。 – EmilDo

+0

谢谢 - 但UISearchController没有属性(searchDisplayController已被弃用) - 但希望有另一种“简单”的方法来解决这些问题。我将检查与UISearchController(atm我没有使用任何控制器,因为我的结果来自一个Web服务,我只能推他们到一个UITableView) – derdida

+0

那么苹果地图应用程序只显示一个UIPopover包含tableViewController,你能否详细说明更多关于你想要看到的理想结果? – EmilDo

回答

1

我能看到为什么这是令人困惑的。您正在寻找的功能以前由UISearchDisplayControllerUISearchDisplayDelegate提供。但这些方法在iOS 8中不推荐使用。

这些日子的方式是使用UISearchController。文档解释得非常好:

您使用initWithSearchResultsController:方法创建一个新的搜索控制器,并传入管理要显示的内容的视图控制器。 searchResultsUpdater属性包含负责更新结果的对象。通常,searchResultsUpdater属性中包含的对象与初始化期间设置的视图控制器相同。但是,如果您创建了自己的模型对象来筛选和响应查询,则可以将其设置为searchResultsUpdater

提供和解除搜索结果的回调机制由UISearchControllerDelegate提供。

+0

谢谢你的回答! – derdida

1

在iPad上做的苹果使用UIPopover,我以前使用下列代表做了同样的事情自定义地图应用:

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    //init a searchPopover with the view you want to show the results in and then call it 
    [self.searchPopover presentPopoverFromRect:[self.search bounds] inView:self.search permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

- (void)searchBarTextDidEndEditing:(UISearchBar *)aSearchBar 
{ 
    [self.searchPopover dismissPopoverAnimated:YES];; 
} 

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

    //update the tableview that is in the searchPopover 
    //searchView is the view inside the popOver, filterResults is a custom method with an NSPredicate inside. 
    [self.searchView filterResultsUsingString:searchText]; 
} 

在视图控制器将显示的结果,你实现委派,这样当用户在该视图中按下所需的按钮或行时,父视图不会被触发,并且弹出窗口被取消,您可以放大所需的注释。

-(void)didSelectResult:(id)annotation 
{ 
    //so when you select the result, and call this delegate method: 
    self.annotationToSelect = annotation; 
    [self.searchBar resignFirstResponder]; 
    self.search.text = @""; 
    [self.searchPopover dismissPopoverAnimated:YES]; 

} 
+0

感谢您分享您的代码 - 我会尝试一下! – derdida

3

您需要检查一次。我认为这个答案会帮助你。

Googlemap searchbar

请首先查看上面的链接。你会得到你的答案。它是在目标-c中,但你可以从中获取参考。

-(void)searchBarSearchButtonClicked:(UISearchBar *)theSearchBar 
{ 
    [theSearchBar resignFirstResponder]; 
    CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
    [geocoder geocodeAddressString:theSearchBar.text completionHandler:^(NSArray *placemarks, NSError *error) { 
     //Error checking 

     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     MKCoordinateRegion region; 
     region.center.latitude = placemark.region.center.latitude; 
     region.center.longitude = placemark.region.center.longitude; 
     MKCoordinateSpan span; 
     double radius = placemark.region.radius/1000; // convert to km 

     NSLog(@"[searchBarSearchButtonClicked] Radius is %f", radius); 
     span.latitudeDelta = radius/112.0; 

     region.span = span; 

     [theMapView setRegion:region animated:YES]; 
    }]; 
}