我正在构建一个Tab Bar应用程序,并在其中一个选项卡上设置了MapView。
我已将其转换为基于视图的应用程序,该应用程序运行良好,因此我知道它的设置正确。
Map上的每个预先放置的引脚都有注释和一个链接到DetailViewController的leftCalloutAccessoryView。我想要的是,标注屏幕(详细视图控制器)只显示在同一个标签中,但当我点击左侧标注按钮时程序崩溃。
我用来触摸Callout Accessory的方法是:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control
{
MillersLocations *annotationTapped = (MillersLocations *)view.annotation;
NSLog(@"button clicked on annotation %@", annotationTapped);
LocationsViewController *thisMap = (LocationsViewController *)[[UIApplication sharedApplication] delegate];
DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
dvc.title = view.annotation.title;
dvc.addressString = view.annotation.subtitle;
[thisMap switchViews:self.view toView:dvc.view]; //This is the line with the error message
}
在'[thisMap switchViews:self.view toView:dvc.view];'我收到SIGABRT错误。错误:
2011-10-25 14:11:11.465 Miller Tab Bar[56230:207] -[Miller_Tab_BarAppDelegate switchViews:toView:]: unrecognized selector sent to instance 0x5835530
2011-10-25 14:11:11.467 Miller Tab Bar[56230:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Miller_Tab_BarAppDelegate switchViews:toView:]: unrecognized selector sent to instance 0x5835530'
在Tab栏应用中,switchViews方法无效吗?如果是这样,Tab Bar应用程序通常使用哪种方法在特定选项卡中切换视图?谢谢你的帮助,我还在学习!
我意识到我称之为'self.view'所以这就是我如何更新代码。由于复制和粘贴错误,我将LocationsViewController设置为委托。:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
MillersLocations *annotationTapped = (MillersLocations *)view.annotation;
NSLog(@"button clicked on annotation %@", annotationTapped);
LocationsViewController *thisMap = [[LocationsViewController alloc]initWithNibName:@"LocationsViewController" bundle:nil];
DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
dvc.title = view.annotation.title;
dvc.addressString = view.annotation.subtitle;
[thisMap switchViews:self.view toView:dvc.view];
}
现在我没有收到错误,但它没有切换视图。它注销了,但一切都没有去。该方法在LocationsViewController.h中声明,并在LocationsViewController.m中实现。为什么它不会链接到任何东西?
答案 0 :(得分:1)
如果callout方法与switchViews
在同一个类中,那么您不需要/不应该在其自身内部创建LocationsViewController
的新实例。而不是[thisMap switchViews...
,它应该只是[self switchViews...
。
然而,在不确切知道该方法的作用的情况下,我无法确定它会做出预期的事情(例如,它将传递给它的self.view
会做什么 - 它会切换回来吗?
除了使用标签栏之外,还有其他几种选择(很多):
将详细视图显示为模态视图控制器。这可以通过以下方式轻松完成:
DetailViewController *dvc = [[DetailViewController alloc] init...
dvc.title = view.annotation.title;
dvc.addressString = view.annotation.subtitle;
[self presentModalViewController:dvc animated:YES];
[dvc release];
使用[self dismissModalViewControllerAnimated:YES];
在地图选项卡中放置UINavigationController
,并使LocationsViewController
该导航控制器的根视图控制器并推送详细视图控制器。完成后将弹出详细视图。实现这一点需要更多的工作,但即使在地图选项卡上显示详细信息视图时,也允许用户使用其他选项卡。
我建议浏览Apple的View Controller Programming Guide以及对该语言的介绍:Learning Objective-C: A Primer和The Objective-C Programming Language。