在通过代码呈现的另一个 ViewController 上显示 AlertController

Posted

技术标签:

【中文标题】在通过代码呈现的另一个 ViewController 上显示 AlertController【英文标题】:Present AlertController Over another ViewController presented via code 【发布时间】:2015-08-18 13:36:19 【问题描述】:

我通过空 VC 上的代码实例化 Parse 的股票 UI 登录屏幕。如果未验证用户的电子邮件,我想然后显示一个 AlertController。所以我在我用代码创建的 logInViewController 上展示了 alertController.... 我理解 AlertController 不在窗口层次结构中的错误,但我不确定如何解决它。如果我关闭 logInViewController 但我不想这样做,它会起作用,我希望它存在于后台。使用斯威夫特。

这个答案没有找到确切的问题:AlertController is not in the window hierarchy

override func viewDidAppear(animated: Bool) 

        super.viewDidAppear(animated)
        if (PFUser.currentUser() == nil) 

            //build logInVC in Code:
            var logInViewController = PFLogInViewController()

            var logInLogoTitle = UILabel()

            logInLogoTitle.text = "Thredz"

            logInLogoTitle.font = UIFont(name: "Cochin", size: 40.0)

            logInViewController.fields = PFLogInFields.UsernameAndPassword | PFLogInFields.LogInButton | PFLogInFields.SignUpButton | PFLogInFields.PasswordForgotten | PFLogInFields.Twitter

            logInViewController.logInView?.backgroundColor = UIColor.whiteColor()

            logInViewController.logInView?.logo = logInLogoTitle

            logInViewController.delegate = self

            //present log in VC
            self.presentViewController(logInViewController, animated: true, completion: nil)

            //build signUpViewController
            var signUpViewController = PFSignUpViewController()

            signUpViewController.delegate = self

            var signUpLogoTitle = UILabel()

            signUpLogoTitle.text = "Thredz"

            signUpViewController.signUpView?.logo = signUpLogoTitle

            logInViewController.signUpController = signUpViewController

        


    



  func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) 


        if (PFTwitterUtils.isLinkedWithUser(user)) 
            var twitterUsername = PFTwitterUtils.twitter()?.screenName

            PFUser.currentUser()?.username = twitterUsername

            PFUser.currentUser()?.saveEventually(nil)

        

        if user["emailVerified"] as! Bool == true 
            dispatch_async(dispatch_get_main_queue()) 
                self.performSegueWithIdentifier(self.peopleTableViewControllerSegue, sender: nil)
            
         else 
            // User needs to verify email address before continuing
            let alertController = UIAlertController(
                title: "Email address verification",
                message: "We have sent you an email that contains a link - you must click this link before you can continue.",
                preferredStyle: UIAlertControllerStyle.Alert
            )
            alertController.addAction(UIAlertAction(title: "OK",
                style: UIAlertActionStyle.Default,
                handler: nil)
            )

            self.presentViewController(alertController, animated: true, completion: nil)
        

    

【问题讨论】:

尝试通过在logInController 上调用presentViewController 来呈现alertController 我看到您正在尝试将 Parse 的 ObjC 登录教程项目转换为 Swift。本教程项目的问题在于,它是一种非常愚蠢的方式来设置登录系统,并且不需要像设置代码那样复杂,而且,他们使用的是像 UIAlertView 这样完全不同的工件来自 UIAlertController。我建议使用不同的教程或方法来完全登录。没有理由需要从另一个视图控制器 viewdidappear 呈现视图控制器。我会尽力为你找到更好的 tut。 我很感激...是的,这是几个教程的混搭。我最初创建了自己的自定义登录和注册,但废弃并实施了默认设置,因为我对 Parse 处理其中一些事情更有信心 =) 【参考方案1】:

在您的 logInViewController(logInController:didLogInUser:) 函数中,更改行

self.presentViewController(alertController, animated: true, completion: nil)

logInController.presentViewController(alertController, animated: true, completion: nil)

这将在登录控制器而不是空视图控制器之上显示警报控制器。

【讨论】:

谢谢!现在很有意义...我是从自我呈现,但从之前呈现的 VC 呈现会保留层次结构。

以上是关于在通过代码呈现的另一个 ViewController 上显示 AlertController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React.js 的另一个组件中更新组件状态变量的值?

如何从另一个 UIView 类访问 UIControl 的值

如何从不是父或子的另一个组件更改功能组件的状态?

2020年北京公务员考试申论:综合分析类题中理解题的另一种答案呈现形式

如何通过管道传输到 Gulp 中的另一个任务?

如何通过 PySide 上的另一个线程从 QMainWindow 类中捕获信号?