【问题标题】:Present viewcontroller from appdelegate over the current view in swift在 swift 中从 appdelegate 呈现视图控制器到当前视图
【发布时间】:2015-02-27 17:15:13
【问题描述】:

我正在尝试从 appdelegate 以编程方式呈现视图。它的基本思想是呈现一个视图,以便用户必须输入代码才能解锁应用程序。此代码有效

func applicationWillResignActive(application: UIApplication) {
    var storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var vc : PasswordViewController = storyboard.instantiateViewControllerWithIdentifier("PasswordViewController") as PasswordViewController
    let navigationController = UINavigationController(rootViewController: vc)
    self.window?.rootViewController?.presentViewController(navigationController, animated: true, completion: nil)
}

但是有问题。如果用户在另一个视图中按下主页(如图所示),密码视图控制器不会显示,我会收到警告

警告:尝试在 UITabBarController:0x7f8c2256ad60 上呈现 UINavigationController:0x7f8c2263c480,其视图不在窗口层次结构中!

左视图显示正常,右视图不显示,注意右视图是使用 + 按钮访问的,它是模态的

欢迎任何帮助!

【问题讨论】:

    标签: swift viewcontroller appdelegate


    【解决方案1】:

    我编写了一个执行类似操作的应用程序 - 恢复应用程序后,系统会提示用户输入 PIN 或返回登录屏幕。

    我认为这样做的诀窍是不要尝试以模态方式呈现 viewController - 我只是用 UIView 覆盖整个窗口,该 UIView 拦截所有触摸并阻止其后面的所有内容。

    通常我只是手动将每个子视图编程到 UIView 中。例如:

    class PasswordView:UIView{
        override init(frame: CGRect) {
            super.init(frame: frame)
            var disabler = UIView(frame: frame)
            disabler.backgroundColor = UIColor(white: 1.0, alpha: 0.2)
            self.addSubview(disabler)
    
            var redBar = UIView(frame: CGRectMake(0,22,frame.width,44))
            redBar.backgroundColor = UIColor.redColor()
            self.addSubview(redBar)
            //etc... and add other elements using code
        }
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    }
    

    这是我管理所有视图的首选方式,因为我保持最大的控制权,但您也可以查看loading from an .xib

    无论如何...在我的应用程序中,我以这种方式创建了这个视图:

    var passCode = PasswordView(frame: GCRectZero)
    
    func applicationDidBecomeActive(application: UIApplication) {
        passCode.removeFromSuperview()
        passCode = PasswordView(frame: self.window!.bounds)
        self.window!.addSubview(passCode)
    }
    

    我建议你给 appDelegate 一个专用的var passCode = PasswordView(frame: GCRectZero),这样你就可以在添加另一个之前将它从超级视图中删除。这样您就不会堆积大量的视图。

    【讨论】:

    • 感谢 CGRev 的帮助
    猜你喜欢
    • 2017-07-09
    • 2016-11-13
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多