ios - 尝试呈现上其视图不在窗口层次结构中
问题描述
我正在尝试使用呼叫工具包实现 VoIP 应用程序。一个特定的场景是接受来电并结束已经通话的呼叫。一旦呼叫得到应答,我将在 OutgoingCallController 中显示我连接的呼叫界面。
因此,在特定场景中,我试图关闭已经连接的 OutgoingCallController,然后尝试再次使用新的来电详细信息呈现新的 OutgoingCallController。
我试图呈现 OutgoingCallController 的逻辑就是这些代码行。我在 CXProviderDelegate 类中调用此方法。
func displayOutgoingScreen() throws {
SwiftyBeaver.verbose("Starting displayOutgoingScreen!! ")
let storyBoard = UIStoryboard.init(name: DiallerProperties.storyBoard, bundle: nil)
let incomingcallController:OutgoingCallWithAllController = storyBoard.instantiateViewController(withIdentifier: "outgoingWithAll") as! OutgoingCallWithAllController
//incomingcallController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
incomingcallController.number = AppDelegate().getIncomingCallNumber()
SwiftyBeaver.verbose("Incoming call number is: \(incomingcallController.number)")
DispatchQueue.main.async(execute: { () -> Void in
let keyWindow = UIApplication.shared.keyWindow
var controller:UIViewController = (keyWindow?.rootViewController)!
while controller.presentedViewController != nil {
controller=controller.presentedViewController!
}
let dateFormatter : DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = Date()
let dateString = dateFormatter.string(from: date)
let interval = date.timeIntervalSince1970
print("presenting view here \(dateString) \(interval)!!")
controller.present(incomingcallController, animated: true, completion: nil)
});
}
特定日期代码用于记录目的,以查看这行代码的执行时间。
在 OutgoingCallWithAllController viewWillDisappear 方法中,我使用相同的日期逻辑来查看该特定方法何时被执行。
这是我收到的输出。
viewWillDisappear test 2019-03-01 13:34:32 1551427472.314188!!
presenting view here 2019-03-01 13:34:32 1551427472.324421!!
这是我在调试器日志中低于上述行的警告消息。
2019-03-01 13:34:32.344713+0530 [710:214818] Warning: Attempt to present <OutgoingCallWithAllController: 0x1040e9600> on <OutgoingCallWithAllController: 0x104042600> whose view is not in the window hierarchy!
这是我用来关闭旧的 OutgoingCallController 的一段代码。传出vc包含对我的 OutgoingCallController 的引用
AppDelegate.shared.outgoingvc?.dismiss(animated: false, completion: nil)
由于我试图解除旧的外出呼叫控制器并再次呈现它,我可以理解我正在尝试在已经被解除的旧控制器上呈现新的外出呼叫控制器。
所以我尝试使用下面的代码来延迟呈现新控制器。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
//providing delay so that outgoing call controller has been closed
action.fulfill()
SwiftyBeaver.verbose("Executing after delay!!")
}
但是,我仍然没有控制权。我该如何解决这个特定问题?
如果万一已经调查过这个问题:
警告:尝试在其视图不在窗口层次结构中的 * 上呈现 * - swift
我明白我将旧的 OutgoingCallController 作为顶视图。
解决方案
我通过在 0.5 秒的间隔后尝试获取最顶层的视图控制器来修复它。
即我在 0.5 秒间隔后调用我的 displayOutgoingScreen 函数。
在那段时间里,我的旧传出控制器恰好被完全关闭,我能够看到我的传出屏幕。
推荐阅读
- c - 如何读取使用 popen 打开的进程的标准输出(使用 \r)
- scala - scala:匹配情况下的“块不能包含声明”
- python - 从 AJAX 调用中抓取 JSON
- ios - 如何设置来电显示或远程 pary id linphone?
- javascript - 如何使用 vee-validate 显示我的错误
- angular - 当我以角度请求我的数据库时,在我的数据列表上显示一条消息
- android - 在 3d 视图中显示时如何在设备屏幕中适合 3D 模型
- sql-server - 如何将单选按钮值保存到 SQLtable
- flutter - 处置后使用了 VideoPlayerController。一旦你在 VideoPlayerController 上调用了 dispose(),它就不能再使用了
- php - 在类中定义另一个伪变量(比如有 `$this` )