警告:尝试在视图不在窗口层次结构中的 **.ViewController 上呈现 ZMNavigationController

Posted

技术标签:

【中文标题】警告:尝试在视图不在窗口层次结构中的 **.ViewController 上呈现 ZMNavigationController【英文标题】:Warning: Attempt to present ZMNavigationController on **.ViewController whose view is not in the window hierarchy 【发布时间】:2018-03-12 08:57:15 【问题描述】:

伙计们,我正面临NavigationController 的一个奇怪问题。现有的答案根本没有帮助!!!!

这是应用程序的基本场景:

    有两个视图 - 主视图和第二视图 当我碰巧点击使用 segue 进入第二个视图时,主视图中有一个按钮。 在第二个视图中,当我在文本视图中输入某个字段并单击一个名为“加入”的按钮后,它会触发“joinMeeting()”函数 并且应该加入会议。

但是,当我这样做时,调试器会显示:

“警告:尝试在 其视图不在窗口中 等级制度!”

所以我已经阅读了大部分的胎面,并且考虑到它是由于 viewDidAppear 方法而发生的,但我必须在 viewDidAppear 之前完成第 n 个工作。点击按钮后一切都会发生。

joinMeeting() 被成功调用并且 print 方法返回 0 这意味着没有 issue(https://developer.zoom.us/docs/ios/error-codes/) 和成功的 SDK 连接但是在调试器中显示此 “警告” 错误之后,应用程序中没有任何反应。

如果有帮助,下面是触发 joinBtn 的代码:

/**
Triggers when Join Button is clicked from second view.
*/
    @IBAction func joinMeeting(_ sender: Any) 
            if( activityID.text == "" ) 
                let alert = UIAlertController(title: "Field is Blank", message: "Activity ID cannot be blank.", preferredStyle: UIAlertControllerStyle.alert)
                alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

                return;
            


            let ms: MobileRTCMeetingService? = MobileRTC.shared().getMeetingService()
            if ms != nil 
                ms?.delegate = self;

                // //For Join a meeting
                let paramDict: [AnyHashable: Any] = [
                    kMeetingParam_Username: kSDKUserName,
                    kMeetingParam_MeetingNumber: activityID.text!,
                ]

                let ret: MobileRTCMeetError? = ms?.joinMeeting(with: paramDict)
                print("onJoinaMeeting ret:\(String(describing: ret))")
            
        

如果有人知道或知道我在这里缺少什么,请提供帮助。

【问题讨论】:

哪行代码抛出了这个错误? 在“let ret: MobileRTCMeetError? = ms?.joinMeeting(with: paramDict)”之后...触发错误 那么您应该编辑您的问题以包含joinMeeting(with:) 的定义。如果没有Minimal, Complete and Verifiable example,您的问题将被视为离题。 对此感到抱歉.. 稍微更新了问题。添加“joinMeeting() 成功” ms?.joinMeeting(with: paramDict) 不能调用名为 joinMeeting 的 IBAction,因为它们的函数签名明显不同。似乎MobileRTCMeetingService 有另一种称为joinMeeting(with:) 的方法,这是您在有问题的线路上调用的方法,而不是joinMeeting(_:),它是连接到您的UIButton 的IBAction。 【参考方案1】:

以下是解决问题的方法:

故事板配置: ViewController --Segue: Show--> JoinViewController

@IBAction func onClickJoin(_ sender: AnyObject) 
        //Main storyBoard
        let initialVC = UIStoryboard(name: "Main", bundle:nil).instantiateInitialViewController() as! UIViewController

        let appDelegate = (UIApplication.shared.delegate as! AppDelegate)

        appDelegate.window?.rootViewController = initialVC

        //Rest of the code
    

【讨论】:

【参考方案2】:

只需在要执行调用的控制器上添加以下代码:

    override func viewWillAppear(_ animated: Bool) 
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
  appDelegate?.window?.rootViewController  = self


【讨论】:

【参考方案3】:

不幸的是,以上解决方案都不适合我。 所以这是我的解决方案。

添加这一行

MobileRTC.shared().setMobileRTCRootController( self.navigationController)

=> 当用户点击加入通话按钮时。

确保这些条件也应满足。

    用于打开ZOOM会议的ViewController应该是根导航控制器的一部分 不要以模态方式显示当前的 Zoom 会议加入视图控制器。始终将其推送到根导航控制器。

【讨论】:

以上是关于警告:尝试在视图不在窗口层次结构中的 **.ViewController 上呈现 ZMNavigationController的主要内容,如果未能解决你的问题,请参考以下文章

警告:尝试呈现不在窗口层次结构中的视图!在 UISearchController

警告:尝试在视图不在窗口层次结构中的 **.ViewController 上呈现 ZMNavigationController

警告:尝试显示不在窗口层次结构中的视图!迅速

警告“尝试呈现视图不在窗口层次结构中的 ViewController - Objective C

警告:尝试在其视图不在窗口层次结构中的 ViewController 上呈现 ViewController (w/UIAlertController)

警告:尝试显示不在窗口层次结构中的视图!使用已识别的 segue 时