在iOS中,活动生命周期的等效物是什么?

72

实际上,我会说iOS的ViewControllers和Android的Activities都有其生命周期方法。例如,ViewController.viewDidLoad()的等价方法是Activity.onCreate()

否则,我还需要知道其他方法的等价:

  • OnStart() 的等价是什么?
  • OnRestart() 的等价是什么?
  • OnResume() 的等价是什么?
  • OnStop() 的等价是什么?
  • OnDestroy() 的等价是什么?
  • OnPause() 的等价是什么?

可能是重复的问题,参考了解iOS UIViewController生命周期 - Greg
2个回答

194

这是 Android 和 iOS 生命周期的比较:

enter image description here

  • 注意:iOS 6 之后,viewDidUnload 已被弃用。

4
谢谢您的回复! - TooCool
3
注意:viewDidUnload 在 iOS 6 之后已被弃用。 - Ryan R
21
据我所知,“viewWillAppear”和“viewDidAppear”会在视图出现在应用程序的窗口/上下文中时被调用,而不是屏幕上,这与每次活动/片段出现在用户面前时调用的“onResume/onStart”不同。 - Felipe Jun
onCreate 的更接近的等效可能是 loadView + viewDidLoad - Dean Kelly
6
从onStart()到ViewWillApear,从onResume到ViewDidAppear,从onPause到ViewWillDisapear,从onStop到ViewDidDisapear,在iOS中实际上没有与onRestart相对应的方法。 - Damyan Todorov
显示剩余3条评论

0

这是以Droid方式完成的方法:

import Foundation
import SwiftUI
import UIKit

public class AppleActivity : UIViewController {
    
  
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        initialize()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }
    
    override public func viewDidLoad() -> Void {
        super.viewDidLoad()
        onCreate()
    }
    
    override public func viewWillAppear(_ animated: Bool) -> Void {
        super.viewWillAppear(animated)
        onStart()
    }

    
    public func initialize(){
        NotificationCenter.default.addObserver(self, selector: #selector(onStart), name: UIApplication.willEnterForegroundNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(onResume), name: UIApplication.didBecomeActiveNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(onPause), name: UIApplication.willResignActiveNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(onStop), name: UIApplication.didEnterBackgroundNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(onDestroy), name: UIApplication.willTerminateNotification, object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    
    public func onCreate() {
        print("onCreate()")
    }
    
    @objc public func onStart() {
        print("onStart()")
    }
    
    @objc public func onResume() {
        print("onResume()")       
    }
    
    @objc public func onPause() {
        print("onPause()")        
    }
    
    @objc public func onStop() {
        print("onStop()")         
    }
    
    @objc public func onDestroy() {
        print("onDestroy()")       
    }
    
    
}


struct AppleActivityStruct : UIViewControllerRepresentable {
    
    typealias UIViewControllerType = AppleActivity
    
    public func makeUIViewController(context : Context) -> AppleActivity {
        return AppleActivity()
    }
    
    public func updateUIViewController(_ uiViewController : AppleActivity, context : Context) {
            // Update the view controller here if needed
    }
}

现在你可以在任何时候触发所有的回调,没有压力+没有麻烦。
注意:由于通过NotificationCenter.default.addObserver(self, selector: #selector(onStart), name: UIApplication.willEnterForegroundNotification, object: nil)的onStart()可能在UIViewController场景第一次创建时不会被调用,所以在viewWillAppear(_ animated: Bool)中调用它。

关于这个问题,有很多地方是错误的。从iOS 13开始,并且支持场景功能,其中一些UIApplication生命周期事件将不会被调用。而且这些事件与视图控制器的生命周期没有任何关联。 - HangarRash
@HangarRash 到目前为止,这在我的设备和模拟器上适用于iOS 16。如果你能指出你实现这个功能时遇到的具体问题,那就太好了。 - linker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接