菜鸟教程小白 发表于 2022-12-13 09:49:56

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 &lt;UIKit/UIKit.h&gt;
#import &lt;GoogleMaps/GoogleMaps.h&gt;

@interface SubmitPointMapViewController : UIViewController &lt;CLLocationManagerDelegate&gt;
{
}

@property (nonatomic) CLLocationCoordinate2D *location;
@property double latitudes;
@property double longitudes;

@end
</code></pre>

<p><strong>SubmitPointMapViewController.m</strong></p>

<pre><code>#import &#34;SubmitPointMapViewController.h&#34;
#import &lt;GoogleMaps/GoogleMaps.h&gt;
#import &lt;Parse/Parse.h&gt;

@interface SubmitPointMapViewController () &lt;GMSMapViewDelegate&gt;
@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:@&#34;SubmitPointmapViewSegue&#34;])
    {
      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]
查看完整版本: ios - 为什么 viewDidLoad 被调用两次