Подтвердить что ты не робот

Обнаруживать, когда нажата кнопка home iOS

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

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

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

Есть ли способ обнаружить, когда нажата кнопка дома, чтобы закрыть порт?

4b9b3361

Ответ 1

Это ваши варианты

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

- (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:.
}

Ответ 2

Самый простой способ справиться с этим - зарегистрироваться для получения уведомления UIApplicationWillResignActiveNotification в вашем контроллере вида.

Событие выдается при нажатии кнопки дома, блокировке и телефонном звонке

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

- (void) myVcInitMethod { 
    [[NSNotificationCenter defaultCenter]
        addObserver:self
        selector:@selector(applicationWillResign)
        name:UIApplicationWillResignActiveNotification 
        object:nil];
}

Ответ 3

В случае пользователя Swift

вы можете написать это следующим образом

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)
}

Ответ 4

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

Ответ 5

viewWillUnload обычно не вызывается, кроме как в случае с низкой памятью. Используйте вместо этого:

В приложении App Delegate:

- (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:.
}

Или, если вы хотите использовать код в своем контроллере просмотра:

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

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

Ответ 6

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

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()
    }

}

Переопределить onStop() и onStart() внутри childs, чтобы поймать все видимость/исчезновение вида

То есть

class SomeViewController: VBase {

...
    override func onStart() {
        super.onStart()
        someFunctionToInitialize()
    }
    override func onStop() {
        super.onStop()
        stopTimer()
        someFunctionToDesctruction()
    }
}