2014-09-23 3 views
2

У меня есть вид карты Google в контроллере просмотра внутри контроллера навигации, который находится на контроллере панели. Все работает так, как должно, но время загрузки на карте варьируется от 5-10 секунд, когда я изначально нажимаю на вкладку «Карта».Пытаться предварительно загрузить Google Maps View

storyboard-layout

Я пришел через несколько постов 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]; 
     } 

    } 
} 

К сожалению, ни одна реализация не загружает вкладку карты.

функции

  • Google Maps SKD 1.7.2
  • IOS SDK 7,1

Редактировать ViewDidLoad на MapViewController.m

- (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_; 
} 

ответ

4

Я предлагаю просто используя вид контейнера (длинный how-to) wh Это очень легко; он будет надежно работать независимо. Если хотите, просто переместите его на экран во время загрузки (возможно, после этого переместите его).

Обратите внимание, что внутри вида контейнера, скажем, «родитель» является класс Boss,

@implementation SomeContaineredView 
-(void)allTheDataLoaded 
    { 
    [(Boss*)self.parentViewController someMethodInBoss]; 
    } 
@end 

это так просто, чтобы поговорить с родительским классом.


Примечание - если вам нужно общаться от родителя к containered зрения, это очень легко, если вы знаете, «глупый трюк», что 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! Надеюсь, это поможет кому-то.

+0

Вы успешно использовали представления контейнеров в качестве стратегии предварительного просмотра представлений? Допустим, я не играл с этим. – eabraham

+0

Абсолютно - много раз. Все, что мы делаем, это сложные клиент-серверные приложения. Обычно я предпочитаю просто держать их в заставке и вставлять их при готовности. – Fattie

+0

Удивительно, я попробую. – eabraham

0

Я думаю, вы могли бы создать его перед этим представлением, а затем просто заставить его появляться при загрузке этого контроллера. Если вы не можете, возможно, вы могли бы создать его вдали от текущего представления, а затем вставить его, когда он будет полностью загружен? (и сделать его гладким)

+0

Да, мой вопрос включает код, который создает экземпляр ViewController, прежде чем он появится. Я подтверждаю, что ViewController запустил ViewDidLoad и тот же объект. К сожалению, для загрузки карты Google по-прежнему требуется более 5 секунд. – eabraham

Смежные вопросы