Изменение MKMapType с использованием модального перехода с частичным скручиванием

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

Для этого я создал переход к другому контроллеру представления, содержащему переключатель для установки типа карты. Переход модальный с использованием частичного завитка. Чтобы получить доступ к значению переключателя, я ввел BOOL, который называется fotoMode в AppDelegate. Если для этой переменной установлено значение YES (и если переключатель установлен в положение ON), я бы хотел перерисовать карту.

- (IBAction) FotoModusSwitchChanged:(UISwitch *)sender 
{
 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];    
if(sender.isOn)
 {
    appDelegate.fotoMode=YES;
 }
 else 
 {
    appDelegate.fotoMode=NO;
 }
}

Я включил следующие строки кода в VieWillAppear, ViewDidAppear, ViewDidLoad, ViewWillLayoutSubviews контроллера представления для представления карты, но это не работает:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];    
if (appDelegate.fotoMode) {
    [self.MapOutlet setMapType:MKMapTypeHybrid];
}
else
{
    [self.MapOutlet setMapType:MKMapTypeStandard];
}

Любая идея, что я делаю неправильно? Спасибо.

PS: установка MKMapType вручную на Hybrid или Standard работает...


person user1612877    schedule 05.10.2012    source источник
comment
Поставьте точку останова на if (appDelegate.fotoMode) и, когда отладчик остановится на этом, проверьте значение appDelegate.fotoMode. Также проверьте, является ли self.MapOutlet nil в этот момент.   -  person    schedule 05.10.2012
comment
Я сделал это, и MapOutlet не равен нулю.   -  person user1612877    schedule 06.10.2012


Ответы (2)


ваш код кажется мне правильным, но я думаю, что у вас проблемы с объявлением «fotoMode».

Убедитесь, что в вашем файле Appdelegate.h вы определяете свой BOOL

@property(nonatomic,assign) BOOL fotoMode;

если вы не объявите свой BOOL правильно, вы не сможете установить и получить правильное значение.

Надежда помогает...

person lionserdar    schedule 05.10.2012
comment
Спасибо за совет. Я объявил fotoMode в Appdelegate.h, как вы сказали. Затем я добавил NSLog, чтобы увидеть, изменилось ли значение fotoMode при изменении switch.isOn. И это так. Однако ни один из методов в контроллере представления с MapView (VieWillAppear, ViewDidAppear, ViewDidLoad, ViewWillLayoutSubviews) не вызывается, когда я покидаю представление, показанное под свернутым MapView, и возвращаюсь к карте. Должен ли я использовать другой метод, который вызывается после выхода из mapView? - person user1612877; 06.10.2012
comment
Я создал это приложение и использовал предоставленный вами код, и он работает. Я поместил ваш код в анимированный метод -(void)viewWillAppear:(BOOL), и карта меняет гибридную/стандартную, когда я переключаю кнопку ВКЛ/ВЫКЛ. ТАК Я не уверен, что вам не хватает. Я бы посоветовал вам проверить свои связи на IB. Я снова только что проверил, и все работает. - person lionserdar; 06.10.2012
comment
Спасибо. Я использую UNavigationController, и я считаю, что проблема в этом. Вероятно, контроллер навигации выполняет отрисовку представления карты и, следовательно, -viewWillAppear a.s.o. методы Map View не вызываются. Это подтверждается тем фактом, что когда я меняю переключатель, открываю представление карты и снова нажимаю, код также работает. Итак, я думаю, что моя первоначальная проблема решена. Спасибо за помощь. - person user1612877; 06.10.2012
comment
Я решил проблему с NavigationController следующим образом: 1. Создайте класс UINavigationController и подключите его к Navigation Controller в раскадровке. 2. реализовать следующий метод в NavigationViewController - (void)dismissViewControllerAnimated:(BOOL)flag complete:(void (^)(void))completion { [self PerformfotoModeCheck]; [супер уволитьViewControllerAnimated: завершение флага: завершение]; } ‹продолжить читать следующий пост› - person user1612877; 06.10.2012
comment
Метод - (void) PerformfotoModeCheck выглядит так: MapViewController * mvc = (MapViewController) [self.viewControllers lastObject] ; if (appDelegate.fotoMode) { [mvc.MapOutlet setMapType:MKMapTypeHybrid]; } else { [mvc.MapOutlet setMapType:MKMapTypeStandard]; } } Теперь это работает. - person user1612877; 06.10.2012

ViewWill/DidAppear не вызывается при закрытии частичного завитка (поскольку старый вид никогда полностью не исчезал). Используйте делегирование для вызова при закрытии страницы настроек.

person Charlie Seligman    schedule 23.05.2014