我正在尝试从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,其视图不在窗口层次结构中!
左视图显示确定视图,右视图不显示,请注意右键是使用+按钮访问它的模态
欢迎任何帮助!
答案 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中删除。这样你就不会堆积大量的观点。