如何从UIView调用presentViewController?

时间:2015-08-13 10:39:46

标签: swift uiview uiviewcontroller presentviewcontroller

我有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后得到一个错误: 其视图不在窗口层次结构中!

任何想法?

1 个答案:

答案 0 :(得分:1)

你在这里实例化一个新的UIViewController

func myV1(sender : UIButton!) {

     v1Ctrl = V1ViewController()
     v1Ctrl.presentViewController(SecondViewController(), animated : true, completion : nil)     

 }

现在应该呈现新的UIViewController的v1Ctrl之前没有添加到Window层次结构中。

通常,您应该考虑您的体系结构,因为UIView不应该负责创建新的UIViewController并显示它。

对您的问题最快的解决方法应该是在v1CtrlviewDidLoad中分配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)     

 }