设置为“初始视图控制器”与使用presentModalViewController加载时,View Controller的行为会有所不同

时间:2012-01-19 02:03:18

标签: objective-c ios uiviewcontroller

我的应用程序有一张跟踪用户位置的地图。此地图仅在特定情况下出现,并且在特定任务完成之前将主导用户的注意,这就是地图不是导航或标签栏UI的一部分的原因。

如果我的地图VC被设置为故事板中的初始视图控制器,它可以正常工作。但是,如果我尝试从其他地方加载地图VC,那么;

MapViewController *mapVC = [[MapViewController alloc] init];
[self presentModalViewController:mapVC animated:YES];

我只是黑屏。

我可以通过NSLog确认VC正在调用viewDidLoad和viewDidAppear,但VC的'map'属性是(null)。我不明白为什么(或如何)在使用这种技术时需要手动创建map属性,但是当它是初始VC时我会完成它。

1 个答案:

答案 0 :(得分:1)

故事板中的MapViewController实例配置了视图层次结构,包括MKMapView,以及您在故事板中配置特定实例所做的任何其他操作。

现在,在此处显示的代码中,您将创建一个全新的MapViewController实例。它与故事板中的实例没有任何关系,除了它们恰好属于同一类。因此,您使用[[MapViewController alloc] init]创建的那个没有视图层次结构(这就是您看到黑屏的原因),并且您没有对其他 MapViewController进行的出口或其他配置在你的故事板中。

所以你想要的是加载你已经从故事板中设置的MapViewController。假设您是从已经从同一故事板加载的另一个视图控制器中的方法中执行此操作,您可以这样做:

// within some method on another vc from a scene in the same storyboard:

// given an identifier for the map view controller we want to load:
static NSString *mapVCIdentifier = @"SomeAppropriateIdentifier";

NSLog(@"Storyboard: %@",self.storyboard); // make sure this vc(self) was loaded from a storyboard
MapViewController *mapVC = [self.storyboard instantiateViewControllerWithIdentifier:mapVCIdentifier];
[self presentModalViewController:mapVC animated:YES];

然后回到故事板中,只需确保将此地图视图控制器的标识符设置为“SomeAppropriateIdentifier”。

希望有所帮助。