Вопрос по iphone, ios, ipad, ios5 – Определить, когда домашняя кнопка нажата iOS

26

У меня есть несколько приложений для iOS, которые все используют один и тот же порт для прослушивания сетевого маяка. На главном экране я использую viewWillDisappear, чтобы закрыть порт при открытии другого вида, который работал отлично. Затем я заметил, что если я нажимаю кнопку «Домой» на контроллере основного представления, не открывая другой вид для закрытия порта, то порт остается открытым, и другие мои приложения больше не могут прослушивать этот порт. Затем я попытался использовать viewWillUnload, но, кажется, не вызывается, когда я нажимаю кнопку «Домой».

-(void)viewWillUnload
{
    //[super viewWillUnload];
    NSLog(@"View will unload");
    [udpSocket close];
    udpSocket = nil;
}

Представление выгрузки никогда не отображается в консоли, что наводит меня на мысль, что метод никогда не вызывается.

Есть ли способ определить, когда нажата кнопка «Домой», чтобы я мог закрыть свой порт?

Попробуйте использовать & quot; applicationWillTerminate & quot; метод. :-) user1126886
& Quot; applicationWillTerminate & quot; Метод не существует. Однако подклассы могут зарегистрироваться для UIApplicationWillTerminateNotification, а затем выполнить собственную очистку или закрытие. Elise van Looij

Ваш Ответ

6   ответов
4

Лучше использоватьUIApplicationWillResignActive а такжеUIApplicationDidBecomeActive из-за того, что они ловят «верхний прямоугольник, событие захвата и освобождения». Я бы предложил использовать этот корневой класс:

class VBase: UIViewController {
    fileprivate var listenersActivated = false
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        onStart()
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        onStop()
        removeListeners()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
        onStop()
        removeListeners()
    }

    internal func iniListeners() {
        if (!listenersActivated) {
            NotificationCenter.default.addObserver(self, selector: #selector(onStop), name: NSNotification.Name.UIApplicationWillResignActive, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(onStart), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
            listenersActivated = true
        } else {

        }
    }
    internal func removeListeners() {
        NotificationCenter.default.removeObserver(self)
        listenersActivated = false
    }
    internal func onStop() {

    }
    internal func onStart() {
        iniListeners()
    }

}

OverrideonStop() а такжеonStart() внутри ребенка, чтобы поймать все видимость / исчезновение

То есть,

class SomeViewController: VBase {

...
    override func onStart() {
        super.onStart()
        someFunctionToInitialize()
    }
    override func onStop() {
        super.onStop()
        stopTimer()
        someFunctionToDesctruction()
    }
}
Спасибо. Это потрясающе.
5

viewWillUnload часто не вызывается, за исключением случаев с нехваткой памяти. Вам лучше реализоватьметоды делегата приложения applicationDidEnterBackground: или жеapplicationWillTerminate: и выполнение работы там или отправка уведомления той части вашего приложения, которая знает, как обрабатывать процесс очистки.

31

чтобы получить уведомление UIApplicationWillResignActiveNotification в вашем контроллере представления.

Событие выдается после нажатия кнопки «Домой», блокировки и телефонного звонка.

- (void) applicationWillResign{
    NSLog(@"About to lose focus");
}

- (void) myVcInitMethod { 
    [[NSNotificationCenter defaultCenter]
        addObserver:self
        selector:@selector(applicationWillResign)
        name:UIApplicationWillResignActiveNotification 
        object:nil];
}
Зачем передавать NULL, а не ноль?
Я отредактировал код, чтобы использовать ноль.
На самом делеapplicationWillResignActive уведомлениеnot всегда лучший способ сделать это, так как отставка активная также включает в себя (случайное) скользящее верхнее меню или новое скользящее нижнее меню в ios 7.applicationDidEnterBackground означает, что ваше приложение было "свернуто" и доступно из iOS 4.
+1, спасибо человек ... ты спас мой день :))
5

viewWillUnload is usually not called except in the case of low memory.  Используйте это вместо:

В вашем приложении делегат:

- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

Или, если вы хотите использовать код в вашем View Controller:

- (void)viewDidDisappear:(BOOL)animated
{
//Put code here
}

- (void)viewWillDisappear:(BOOL)animated
{
//Put code here
}
viewWill / DidDisappear будет вызывать, когда приложение закрывается. Не при нажатии кнопки «Домой», чтобы свернуть приложения для центра управления.
44

В вашем приложении делегат:

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
Поскольку я, очевидно, согласен, +1
viewWillDisappear или жеviewDidDisappear не вызывается при нажатии кнопки «Домой» или при закрытии приложения. Лучшее решение используетUIApplicationWillResignActiveNotification уведомление
У меня был код для закрытия порта в viewWillDisappear, и он, похоже, не вызывался. Порт останется открытым, и все другие приложения, которые использовали этот порт, не будут работать. Я установил метод класса, чтобы закрыть порт и вызвать его из applicationDidEnterBackground, и он прекрасно работает nick
10

Вы можете написать это так

override func viewDidLoad() {
    super.viewDidLoad()

    // code here...

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "applicationWillResignActive:",
        name: UIApplicationWillResignActiveNotification,
        object: nil)
}

func applicationWillResignActive(notification: NSNotification) {
    print("I'm out of focus!")
}

Кроме того, не забудьте закрыть его, когда ваше приложение завершается

deinit {

    // code here...

    NSNotificationCenter.defaultCenter().removeObserver(self)
}
Если вы используете iOS 9 или более позднюю версию, вы можете забыть об удалении наблюдателей в методе deinit. Но только если вы не планируете поддерживать iOS 8 или более раннюю версию. И, как сказал @bobobobo, вы должны использовать applicationDidEnterBackground

Похожие вопросы