【发布时间】:2018-03-10 01:12:54
【问题描述】:
在 AppDelegate 中,每当收到 VoIP 呼叫(推送通知)时,都会调用以下函数,从而创建多个“VideoCallViewController”实例
如下所示,我使用 deinit(在 VideoCallViewController 中)来检查是否在创建新的“VideoCallViewController”实例之前取消了先前的“VideoCallViewController”实例,令我惊讶的是print("Deinitializing VC) 不是t 调用,将实例留在内存中。
如果 AppDelegate 中已经存在 VideoCallViewController 的实例,我如何显示 VideoCallViewController 及其导航控制器。
在 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()
}
【问题讨论】:
-
如果你想确保只创建一个实例,为什么不创建一个单例?
-
单例视图控制器不是一个好主意;首先,很难从情节提要中初始化一个。您应该能够让您当前的视图控制器在您的应用程序委托上存储对自身的引用。然后,您可以轻松地调用当前视图控制器上的函数来处理调用。
-
@Paulw11,您能否详细说明您的建议?
标签: ios swift swift3 uiviewcontroller uinavigationcontroller