如何从 UIView 调用 presentViewController?

How call presentViewController from UIView?

我有 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 和 Segue 的情况下工作以在 viewController 之间转换。

那个问题是,在我 运行 应用程序并点击 btn 后出现错误: 其视图不在 window 层次结构中!

有什么想法吗?

您正在此处实例化一个新的 UIViewController

func myV1(sender : UIButton!) {

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

 }

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

通常,您应该考虑您的架构,因为 UIView 不应该负责创建新的 UIViewController 并呈现它。

解决您问题的最快方法应该是在 class V1ViewControllerviewDidLoad 中分配 v1Ctrlvar 并删除行 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)     

 }