我在Tabbar控制器上的导航控制器内部的视图控制器中有一个Google Map View。一切正常,但是当我最初点击地图选项卡时,地图上的加载时间范围为5-10秒。
我遇到了几个StackOverflow帖子,其中列出了以下预加载标签的方法:
for (UIViewController *viewController in self.tabBarController.viewControllers)
{
[viewController view];
}
我已将其修改为我的特定实现。
for (UIViewController *viewController in self.tabBarController.viewControllers)
{
UINavigationController *navCon = (UINavigationController*)viewController;
for (UIViewController *vc in navCon.viewControllers) {
if ([[NSString stringWithFormat:@"%@",vc.class] isEqual: @"MapViewController"]){
MapViewController *mv = (MapViewController*) vc;
[mv view];
}
}
}
不幸的是,两种实现都没有预先加载地图选项卡。
功能
编辑 MapViewController.m上的ViewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
mapView_ = [GMSMapView mapWithFrame:self.view.bounds camera:nil];
mapView_.delegate = self;
AppDelegate *appDelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;
CLLocationCoordinate2D loc=appDelegate.locationManager.location.coordinate;
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:loc.latitude
longitude:loc.longitude
zoom:12];
[mapView_ setCamera:camera];
mapView_.myLocationEnabled=YES;
mapView_.settings.myLocationButton = YES;
self.view = mapView_;
}
答案 0 :(得分:4)
我建议只使用容器视图(long how-to),这很容易;然后它将可靠地独立工作。如果您愿意,只需在加载时将其移出屏幕(也许可以在之后将其滑入)。
请注意,在容器视图中,假设“父”是Boss类,
@implementation SomeContaineredView
-(void)allTheDataLoaded
{
[(Boss*)self.parentViewController someMethodInBoss];
}
@end
与父类交谈很容易。
注意 - 如果你需要将从父母传播到容器视图,如果你知道Apple让你做的“愚蠢技巧”,那就很容易了。https://stackoverflow.com/a/15706092/294884
这有点令人讨厌,对于这样一个基本的操作,你总是做得很好。你在prepareForSegue中这样做:像这样......
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"containerLogin"])
self.vcLogin = (LoginVC *)segue.destinationViewController;
if ([segue.identifier isEqualToString:@"containerStartNew"])
self.vcStartNew = (StartNewVC *)segue.destinationViewController;
}
在示例中有两个容器视图。 (使用标识符“containerLogin”和“containerStartNew”)所以,我有两个属性(self.vcLogin,self.vcStartNew)。这正是你设置它们的方式。
请注意, prepareForSegue 命名错误。它应该被称为“设置,当你有一个嵌入segue时运行”我在这里详细解释:https://stackoverflow.com/a/24351813/294884
#define seg(A, B, C) if ([segue.identifier isEqualToString:A]) \
B = (C *)segue.destinationViewController;
在我们开展的每个项目中,我们都使用该宏。
然后你可以简单地写一下:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
seg(@"cOverlayBuy", self.rockets, Rockets);
seg(@"cOverlayMainMenu", self.overlayMainMenu, OverlayMainMenu);
seg(@"cSearch", self.search, Search);
seg(@"cMeeting", self.meeting, Meeting);
seg(@"cMeetings", self.meetings, Meetings);
seg(@"cBooks", self.bikes, Bikes);
seg(@"cPeople", self.cars, Cars);
}
因为,现在,每个场景都有许多容器视图,我们拥有的每个场景,对于每个客户端,在“prepareForSegue”调用中都有该代码。
因此,一旦该代码运行,您最终可以“访问容器视图!”
[self.cars displayColors:@"red"];
self.cars.view.hidden=YES;
[self.meetings calculateNewTimesNow];
......等等。
就像我说的,我们在每个项目中都使用这个宏。几乎每个场景现在都有几个容器视图,因此它存在于每个VC中!希望它可以帮到某人。
答案 1 :(得分:0)
我认为您可以在该视图之前实例化它,然后在加载该控制器时使其显示。如果你不能,也许你可以远离当前视图创建它,然后在满载时将其滑入? (并使其看起来光滑)