从appdelegate呈现viewcontroller在swift中的当前视图

时间:2014-12-31 17:04:56

标签: swift viewcontroller appdelegate

我正在尝试从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上显示UINavigationController:0x7f8c2263c480:0x7f8c2256ad60,其视图不在窗口层次结构中!

左视图显示确定视图,右视图不显示,请注意右键是使用+按钮访问它的模态

enter image description here

欢迎任何帮助!

1 个答案:

答案 0 :(得分:3)

我写了一个类似这样的应用程序 - 在恢复应用程序时,系统会提示用户输入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),这样你就可以在添加另一个之前将它从superview中删除。这样你就不会堆积大量的观点。