选项卡栏应用程序中的calloutAccessoryControlTapped方法(MapView)导致崩溃(switchViews)

时间:2011-10-25 18:27:28

标签: xcode annotations mkmapview tabbar

我正在构建一个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中实现。为什么它不会链接到任何东西?

1 个答案:

答案 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 PrimerThe Objective-C Programming Language