ios - 避免创建多个 ViewController 实例,iOS Swift

标签 ios swift swift3 uiviewcontroller uinavigationcontroller

在 AppDelegate 中,只要收到 VoIP 调用(推送通知),就会调用以下函数,从而创建“VideoCallViewController”的多个实例

我已经使用 deinit(在 VideoCallViewController 中),如下所示,以检查在创建“VideoCallViewController”的新实例之前是否取消了“VideoCallViewController”的先前实例,令我惊讶的是 print( “Deinitializing VC) 没有被调用,将实例留在内存中。

如果 AppDelegate 中已经存在 VideoCallViewController 实例,我如何显示 VideoCallViewController 及其导航 Controller 。

在 VideoCallViewController 中

deinit {
  print("Deinitializing VC)
}

在 AppDelegate 中

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    videoVC = storyboard.instantiateViewController(withIdentifier: "VideoCallViewController") as! VideoCallViewController

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = videoVC
    self.window?.makeKeyAndVisible()

}

最佳答案

您可以在 AppDelegate 中创建一个惰性变量

lazy var videoVC: UIViewController = {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    return storyboard.instantiateViewController(withIdentifier: "VideoCallViewController")
}()

然后在你的 pushRegistry 中:

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = self.videoVC
    self.window?.makeKeyAndVisible()

}

关于ios - 避免创建多个 ViewController 实例,iOS Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46466660/

相关文章:

ios - 如何防止 iOS 在从后台返回后调整 UIViewController View 的大小

ios - 无法在 Xcode 9 中读取 Images.xcassets 的文件属性

iOS App Store 搜索 url 方案

iphone - iOS动画下雪

swift - 设置 Firestore 文档时如何检测网络连接缺失

ios - 在 MapKit Swift 中禁用 Mylocation Marker Tap

ios - Jenkins 找不到 xcode 配置文件

ios - Swift iOS - 当应用程序从后台返回时,AVPlayer 视频卡住/暂停

Swift 如何使用 Segue 通过 View Controller 传递数据?

ios - 使用 Apple Maps 转弯导航到注释