ios - 为什么 viewDidLoad 被调用两次
<p><p>我有一个 GPS 应用,它使用 Googlemap 来处理基于位置的事件。该应用会处理应用内的所有位置事件,不会切换到 Google 自己的 Googlemap 应用。</p>
<p> Storyboard如下图所示。
<img src="/image/uYNY3.png" alt="enter image description here"/> </p>
<p>在应用程序中,我有一个主 mapView (我在 StoryBoard 中的 mapViewController ),它显示用户当前位置以及 map 上用户周围标记位置的列表。该 map 还包含一个按钮,可将用户带到他们标记的点列表(点 TableViewController 列表)。选择任何列表点会将它们带到该点的详细描述(记录一个点)。最后单击此 View 上的“在 map 上查看”按钮将他们带到最后一个 View (提交点 mapViewController ),在那里他们可以看到该点在另一个 Viewmap 上放大。</p>
<p>两个 mapView (我的 mapViewController 和提交点 mapViewController )都使用下面列出的类似代码。但是,当我运行代码并进入“提交点 mapViewController ”时,此 ViewviewDidLoad 方法会执行两次,正如我在单步执行代码时所注意到的那样。这会导致加载 2 个 View ,一个接一个。我也可以在模拟器中看到这种情况。在模拟器上,加载的第一个 View 有一个名为“Log a Point”的后退按钮,正如预期的那样,因为这是堆栈中的前一个 View 。加载的下一个 View 只是将“返回”作为后退按钮 - 如下图所示。</p>
<p> <img src="/image/qBa5d.png" alt="enter image description here"/>
<img src="/image/YEz8K.png" alt="enter image description here"/> </p>
<p>这在模拟器上不是问题,我可以导航回 Log a PointView 。但是在我的手机上,当我尝试导航回记录点 View 并给出错误“<strong><em>嵌套推送动画可能导致导航栏损坏。在意外状态下完成导航转换时,应用程序崩溃了。导航栏 subview 树可能会损坏。</em></strong>"</p>
<p>我已经检查过了,我没有重复这个 View 两次,也没有做任何我在第一个 mapView 上没有做的事情。有谁知道为什么这个 ViewviewDidLoad 方法可以被调用两次?我已经读到这个错误是从 ListView 中引发的,但在这种情况下我不是来自 ListView ——即使在这个过程的早期有一个 ListView 。</p>
<p>以下是我的提交点 mapViewController.h 和 .m 文件(为简洁起见省略了一些代码)</p>
<p><strong>SubmitPointMapViewController.h</strong></p>
<pre><code>#import <UIKit/UIKit.h>
#import <GoogleMaps/GoogleMaps.h>
@interface SubmitPointMapViewController : UIViewController <CLLocationManagerDelegate>
{
}
@property (nonatomic) CLLocationCoordinate2D *location;
@property double latitudes;
@property double longitudes;
@end
</code></pre>
<p><strong>SubmitPointMapViewController.m</strong></p>
<pre><code>#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 = [ init];
GMSCameraPosition *camera = ;
mapView = ;
mapView.myLocationEnabled = YES;
;
self.view = mapView;
// Set the MyLocationButton and add the button to the MapView
mapView.settings.myLocationButton = YES;
// Setup Markers on the Map
;
}
@end
</code></pre>
<p><strong>编辑:</strong>下面是我在 Log a PointView 上的 Connections 检查器,以及在同一 View 上按下 View on map 按钮时的 segue 代码</p>
<p> <img src="/image/qcQgu.png" alt="enter image description here"/> </p>
<pre><code>- (IBAction)viewOnMapButtonPreseed:(id)sender
{
;
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([ isEqualToString:@"SubmitPointmapViewSegue"])
{
SubmitPointMapViewController *vc = ;
vc.latitudes = pointObject.latitude;
vc.longitudes = pointObject.longitude;
}
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>正如上面@Simon Goldeen 和@pbasdf 所建议的那样 - 问题是我将 2 个 mapViewController 推送到堆栈上。我以前用于调试的旧 segue 导致了问题。我删除了此 mapView 的所有转接,而是按如下方式转接至 mapView :</p>
<pre><code>SubmitPointMapViewController *vc = [ init];
UIStoryboard *storyboard = ;
vc = (SubmitPointMapViewController *);
[ pushViewController:vc animated:YES];
</code></pre>
<p>我想我会在这里发布我的答案,以防其他人遇到同样的问题。 </p>
<p>感谢 @Simon Goldeen 和 @pbasdf 帮助我解决此问题。 </p></p>
<p style="font-size: 20px;">关于ios - 为什么 viewDidLoad 被调用两次,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/26875936/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/26875936/
</a>
</p>
页:
[1]