Detect when home button is pressed iOS

前端 未结 6 724
半阙折子戏
半阙折子戏 2020-12-05 10:28

I have several iOS apps that all use the same port to listen for a network beacon. On the main view I use viewWillDisappear to close the port when another view is opened, w

6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-05 10:51

    Better to use UIApplicationWillResignActive and UIApplicationDidBecomeActive due to they catch 'top rectangle catch and release event'. I would suggest to use this root class:

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

    Override onStop() and onStart() inside childs to catch all view appearance/disappearance

    That is,

    class SomeViewController: VBase {
    
    ...
        override func onStart() {
            super.onStart()
            someFunctionToInitialize()
        }
        override func onStop() {
            super.onStop()
            stopTimer()
            someFunctionToDesctruction()
        }
    }
    

提交回复
热议问题