2013-09-10 4 views
7

Мне было интересно, если viewWillDisappear: и viewDidDisappear: вызывать, когда iOS переключает приложения (например, кнопка «Домой» нажимается пользователем). Это приведет к тому, что вид исчезнет с экрана, но вызовы вызываются для этого?Do viewWillDisappear/viewDidDisappear вызывается при переключении приложений?

+7

И каковы результаты ваше тестирование? –

+1

Я уверен, что есть люди, которые задавались этим вопросом. Googling все еще быстрее, чем кодирование тестового проекта. – gabor

+0

делегаты приложений вызываются только во время переключения приложений. –

ответ

11

Нет, эти методы не будут вызываться в этом случае.

Чтобы получать уведомление, когда приложение переходит в фоновый режим, вы можете зарегистрироваться для уведомления UIApplicationWillResignActiveNotification.

Как в стороне, самый простой способ узнать это - просто быстро создать супер простое приложение и установить точки останова.

15

Вы можете.

Решение, которое я использовал ранее, заключается в использовании applicationDidEnterBackground: и applicationWillEnterForeground: в вашем делете приложения.

Сделайте это в своем делете приложения.

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [self.window.rootViewController beginAppearanceTransition:NO animated:NO]; 
    [self.window.rootViewController endAppearanceTransition]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application { 
    [self.window.rootViewController beginAppearanceTransition:YES animated:NO]; 
    [self.window.rootViewController endAppearanceTransition]; 
} 

Теперь ваши viewWillDisappear:, viewDidDisappear:, viewWillAppear: и viewDidAppear: методы вашего зрения иерархии контроллера будет вызвана, когда вы приложение идет на фоне и обратно на передний план.

Надеюсь, это сработает?


Edit 24/11/16 (Swift 3 версия)

func applicationDidEnterBackground(_ application: UIApplication) { 
    window?.rootViewController?.beginAppearanceTransition(false, animated: false) 
    window?.rootViewController?.endAppearanceTransition() 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    window?.rootViewController?.beginAppearanceTransition(true, animated: false) 
    window?.rootViewController?.endAppearanceTransition() 
} 

Редактировать 2/1/2017 (все окна)

func applicationDidEnterBackground(_ application: UIApplication) { 
    for window in application.windows { 
     window.rootViewController?.beginAppearanceTransition(false, animated: false) 
     window.rootViewController?.endAppearanceTransition() 
    } 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    for window in application.windows { 
     window.rootViewController?.beginAppearanceTransition(true, animated: false) 
     window.rootViewController?.endAppearanceTransition() 
    } 
} 
+0

Кажется удивительно просто. Но есть ли какие-либо (противные) побочные эффекты для этого? –

+0

Если вы не делаете что-то сумасшедшее, как сдавать инициализирующий код в любом 'viewWillAppear:' или аналогичном коде деструктора в 'viewWillDisappear:', я не вижу, чтобы это вызывало какие-либо проблемы. До сих пор я этого не видел. – Trenskow

+0

Я добавил код, чтобы показать, как запускать вызовы во всех окнах приложений. Это должен быть единственный недостаток первого - он работает только в главном окне. – Trenskow

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