我有2个UIView和2个UIviewController,如下所示:
//define my view class
class myV1 : UIView {
v1Ctrl : V1ViewController!
//init view
init() {
super.init(frame: UIScreen.MainScreen().bouns)
//create button in order to transfer to other viewcontroller
var btn : UIButton = UIButton()
btn.addTarget(self, action : "btnFunc:", forControlEvents : UIControlEvents.TouchUpInside)
// and add more like settitle and setTitleColor and etc, Finally add to view
view.addSubView(btn)
}
init(coder aDecoder :NsCoder) {
super.init(coder : ADecoder)
}
}
func btnFunc(sender : UIButton!) {
v1Ctrl = V1ViewController()
v1Ctrl.presentViewController(SecondViewController(), animated : true, completion : nil)
}
和其他视图与myV1相同
我的V1ViewController如下所示:
class V1ViewController : UIViewController {
var V1 : Myv1!
override func viewDidLoad() {
V1 = Myv1()
self.view.addSubView(V1)
}
}
我的应用程序在没有Storyboard的情况下工作,并且可以在viewControllers之间进行转换。
那个问题是我运行应用程序并触摸btn后得到一个错误: 其视图不在窗口层次结构中!
任何想法?
答案 0 :(得分:1)
你在这里实例化一个新的UIViewController
func myV1(sender : UIButton!) {
v1Ctrl = V1ViewController()
v1Ctrl.presentViewController(SecondViewController(), animated : true, completion : nil)
}
现在应该呈现新的UIViewController的v1Ctrl
之前没有添加到Window层次结构中。
通常,您应该考虑您的体系结构,因为UIView不应该负责创建新的UIViewController并显示它。
对您的问题最快的解决方法应该是在v1Ctrl
类viewDidLoad
中分配V1ViewController
var,然后删除行v1Ctrl = V1ViewController()
class V1ViewController : UIViewController {
var V1 : Myv1!
override func viewDidLoad() {
V1 = Myv1()
V1.v1Ctrl = self
self.view.addSubView(V1)
}
}
func myV1(sender : UIButton!) {
v1Ctrl.presentViewController(SecondViewController(), animated : true, completion : nil)
}