我有一个GPS应用程序,它使用谷歌地图来处理基于位置的事件。该应用程序处理应用程序中的所有位置事件,并且不会切换到谷歌自己的谷歌地图应用程序。
故事板可以在下面的图片中看到。
在应用程序中,我有一个主地图视图(我在StoryBoard中的我的地图视图控制器),它显示用户的当前位置以及地图上用户周围标记位置的列表。此地图还包含一个按钮,用于将用户带到其标记点列表(点列表视图控制器)。选择任何列表点将使他们获得该点的详细描述(记录点)。最后点击此视图上的“在地图上查看”按钮将它们带到最后一个视图(提交点地图视图控制器),在那里他们可以看到此点放大到另一个视图地图上。
地图视图(我的地图视图控制器和提交点地图视图控制器)都使用下面列出的类似代码。但是,当我运行代码并运行“提交点映射视图控制器”时,这个视图viewDidLoad方法执行两次,因为我已经注意到单步执行代码。这会导致加载2个视图,一个接一个地加载。我也可以在模拟器中看到这种情况。在模拟器上,加载的第一个视图有一个标题为“Log a Point”的后退按钮,因为这是堆栈中的上一个视图。加载的下一个视图只有后退按钮的“后退” - 如下图所示。
这不是模拟器上的问题,我可以导航回Log a Point视图。但是在我的手机上,当我尝试导航回Log a Point视图时出现错误“ 嵌套推送动画可能导致导航栏损坏。在导致意外状态下完成导航过渡时,应用程序崩溃。导航栏子视图树可能已损坏。 “
我已经检查过了,我没有两次看到这个视图,或者做了我在第一个地图视图上没有做的任何事情。有谁知道为什么这个视图viewDidLoad方法可以被调用两次?我已经在SO上看到这个错误是从列表视图中抛出的,但在这种情况下我不是来自列表视图 - 即使在此过程中有一个列表视图。
下面是我的提交点地图视图控制器.h和.m文件(为简洁起见省略了一些代码)
SubmitPointMapViewController.h
#import <UIKit/UIKit.h>
#import <GoogleMaps/GoogleMaps.h>
@interface SubmitPointMapViewController : UIViewController <CLLocationManagerDelegate>
{
}
@property (nonatomic) CLLocationCoordinate2D *location;
@property double latitudes;
@property double longitudes;
@end
SubmitPointMapViewController.m
#import "SubmitPointMapViewController.h"
#import <GoogleMaps/GoogleMaps.h>
#import <Parse/Parse.h>
@interface SubmitPointMapViewController () <GMSMapViewDelegate>
@end
@implementation SubmitPointMapViewController
{
GMSMapView *mapView;
CLLocationManager *locationManager;
}
@synthesize latitudes;
@synthesize longitudes;
- (void)viewDidLoad
{
// This entire method called twice - one right after the other
mapView.delegate = self;
locationManager = [[CLLocationManager alloc] init];
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude: latitudes longitude: longitudes zoom:17];
mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
mapView.myLocationEnabled = YES;
[mapView setMapType:kGMSTypeNormal];
self.view = mapView;
// Set the MyLocationButton and add the button to the MapView
mapView.settings.myLocationButton = YES;
// Setup Markers on the Map
[self setupMarkersOnMap];
}
@end
编辑:下面是Log a Point视图中的Connections检查器,以及在同一视图上按下地图上查看按钮时的segue代码
- (IBAction)viewOnMapButtonPreseed:(id)sender
{
[self performSegueWithIdentifier:@"SubmitPointmapViewSegue" sender:sender];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"SubmitPointmapViewSegue"])
{
SubmitPointMapViewController *vc = [segue destinationViewController];
vc.latitudes = pointObject.latitude;
vc.longitudes = pointObject.longitude;
}
}
答案 0 :(得分:4)
正如@Simon Goldeen和@pbasdf上面提到的那样 - 问题是我正在将2个地图视图控制器推入堆栈。我之前使用的旧的segue用于调试导致问题。我删除了这个地图视图的所有segues,而是按照以下方式拼接到地图视图:
SubmitPointMapViewController *vc = [[SubmitPointMapViewController alloc] init];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
vc = (SubmitPointMapViewController *)[storyboard instantiateViewControllerWithIdentifier:@"SubmitPointMapViewControllerStoryboardID"];
[[self navigationController] pushViewController:vc animated:YES];
我想我会在这里发布我的答案,以防其他人遇到同样的问题。
@Simon Goldeen和@pbasdf帮助我解决了这个问题。