2015-05-22 2 views
2

У меня есть просто посмотреть контроллер с объектом MKMapView внутри, определяется таким образом:MKMapView с прошивкой 8 аварии

декларации Класс:

@interface GeoViewController : UIViewController <MKMapViewDelegate> 

@property (nonatomic, strong) MKMapView* viewMap; 

@end 

реализации:

@implementation GeoViewController 

- viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    viewMap = [[MKMapView alloc] init]; 
    MKCoordinateRegion worldRegion = MKCoordinateRegionForMapRect(MKMapRectWorld); 
    [viewMap setRegion:worldRegion animated:YES]; 
    viewMap.pitchEnabled = YES; 
    viewMap.showsUserLocation = YES; 
    viewMap.delegate = self; 
    [self.view addSubview:viewMap]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    viewMap.showsUserLocation = NO; 
    self.viewMap.delegate = nil; 
    [self.viewMap removeFromSuperview]; 
} 

- (void)resizeForOrientation:(BOOL)isLandscape withFrame:(CGRect)frame { 
    [super resizeForOrientation:isLandscape withFrame:frame]; 
    const CGRect fullFrame = CGRectMake(0, 0, frame.size.width, frame.size.height); 
    viewMap.frame = fullFrame; 
} 

@end 

Первая время, которое я представляю контроллеру вида. Затем я перейти в моем приложении, и если я вернусь на GeoViewController, аварии:

  • нет сообщения об ошибке на консоли
  • main.m открыт и отчет «Thread 1: EXC_BAD_ACCESS»
  • отладочную навигатора (слева) я получаю сообщение об ошибке на тему 1:

    EAGLContext_renderbufferStorageFromDrawable (EAGLContext *, objc_selector *, беззнаковое целочисленное значение, идентификатор)

Теперь, прибегая к помощи много, я не могу найти рабочее решение для меня:

Я также примерить на viewDidDisappear, но никак не

[EAGLContext setCurrentContext:nil]; 

КАЖЕТСЯ сбой для этой строки:

viewMap.frame = fullFrame; 

Любое предложение будет оценено!

обновление

я получаю другие ошибки когда-нибудь в моем тесте:

OpenGL нить конфликт обнаружен

+0

Может быть не связаны, но так как 'viewMap' это свойство, вы должны назначить его с помощью' self.viewMap = ... 'вместо того, чтобы просто' viewMap = ... '. Поэтому 'viewMap = [[MKMapView alloc] init];' должен быть 'self.viewMap = [[MKMapView alloc] init];'. – Anna

ответ

0

Я думаю, что эта линия является одной причиной проблемы

[self.viewMap removeFromSuperview]; 

Поскольку если вы сказали, что только что перешли к просмотру, viewDidLoad больше не будет вызываться. Вот почему он сказал, что «Thread 1: EXC_BAD_ACCESS», потому что вы обращаетесь к выпущенному объекту. Он вылетает из рамки viewMap.frame =, потому что вы обращаетесь к объекту viewMap, который уже выпущен, потому что вы удаляете его из своего супервизора.

+0

пока что я перешел на viewDidAppear: (BOOL) анимированный, и это то же самое. –

+0

попробуйте viewWillAppear: (BOOL) анимированный –

+0

или вы можете просто не удалять self.viewMap из своего супервизора. Поскольку вы используете ARC, self.viewMap будет автоматически выпущен, когда он больше не будет использоваться. –

0

viewDidAppear вызывается, когда вы нажимаете на ваш контроллер, а также когда на нем установлен другой контроллер. Следовательно, в момент, когда вы перемещаетесь, вы удаляете карту. То же самое относится к viewWillDisappear, так как он будет вызываться, когда вы нажимаете новый контроллер сверху, а также когда вы, наконец, отключите свой контроллер.

Просто измените свои функции, чтобы добавить карту, когда контроллер впервые появится, и только удалите, когда контроллер выталкивается из навигационного контроллера.Что-то вроде:

- viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    if (self.isMovingToParentViewController){ 
     viewMap = [[MKMapView alloc] init]; 
     MKCoordinateRegion worldRegion = MKCoordinateRegionForMapRect(MKMapRectWorld); 
     [viewMap setRegion:worldRegion animated:YES]; 
     viewMap.pitchEnabled = YES; 
     viewMap.showsUserLocation = YES; 
     viewMap.delegate = self; 
     [self.view addSubview:viewMap]; 
    } 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // If being popped off, remove the map view. Otherwise 
    // leave it alone as we need it when the user navigates 
    // back 
    if (self.isMovingFromParentViewController){ 
    viewMap.showsUserLocation = NO; 
    self.viewMap.delegate = nil; 
    [self.viewMap removeFromSuperview]; 
    } 
} 

}

Это гарантирует, что карта присутствует на протяжении всего срока службы контроллера, который должен убеждаться любой доступ к действительно во все времена.

+0

К сожалению, это не решит мою проблему. –

+0

@Velthune Я заметил, что вы отредактировали свой вопрос и переместили карту на 'viewDidAppear'. Вы также должны установить охрану вокруг этого, чтобы вы создавали только при первом нажатии контроллера. См. Обновленный ответ. Если вы добавляете/удаляете все время, существует период, когда у вас нет карты. Поэтому создайте его на первом показе и удалите его, когда выскочили, как показано в обновленном ответе. –

+0

Я попробую окунуться! –

4

Я получил EXC_ARM_DA_ALIGN ошибки в

EAGLContext_renderbufferStorageFromDrawable(EAGLContext*, objc_selector*, unsigned int, id) 

Aswell, при использовании MKMapView.

Обходное решение, упомянутое в этом вопросе: Adding google maps as subview crashes iOS app with exc_bad работал для меня.

Отключение функции «Захват графического ядра» в моих целевых схемах сделало трюк.

+0

Да, это работает для меня! – ziggear

+0

Работает. Ницца –

2

Продукт -> Изменить схему -> Выполнить -> Параметры -> Установить захват кадров графического процессора для инвалидов.

Refetence Link

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