Как вызвать presentViewController из 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 для перехода между viewControllers.

Эта проблема заключается в том, что после того, как я запускаю приложение и нажимаю кнопку, я получаю сообщение об ошибке: чье представление не находится в иерархии окон!

Есть идеи?


person Ali SadeghipourKorabaslo    schedule 13.08.2015    source источник


Ответы (1)


Здесь вы создаете экземпляр нового UIViewController.

func myV1(sender : UIButton!) {

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

 }

И v1Ctrl, который теперь должен представлять новый UIViewController, ранее не добавлялся в иерархию окон.

Как правило, вам следует подумать о своей архитектуре, потому что UIView не должен нести ответственность за создание нового UIViewController и его представление.

Самое быстрое решение вашей проблемы должно состоять в том, чтобы назначить v1Ctrlvar в viewDidLoad класса V1ViewController и удалить строку 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)     

 }
person JulianM    schedule 13.08.2015