Создайте экземпляр контроллера представления и перейдите к нему программно

У меня есть два контроллера представления в моей раскадровке: view1 и view2.

В view1 я использовал раскадровку, чтобы перейти от табличного представления к view2.

Но теперь в view2 я программно создал кнопку, и предполагается, что она переходит к другому экземпляру view2.

Когда кнопка нажата, я сделал функцию для выполнения:

func buttonPressed(sender: UIButton){
  //TODO:- GET NEXT PAGE
  self.performSegueWithIdentifier("anotherView2", sender: sender)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if(segue.identifier == "anotherView2"){
    let anotherView2Controller = segue.destinationViewController as! View2
    ...
    ...
  }
}

Конечно, это не работает, так как нет идентификатора перехода с именем anotherView2. Поэтому я хочу сделать это как-то, но я действительно не могу найти хороший способ справиться с этим.

Есть ли способ создать переход программно? Я попытался сделать переход из раскадровки, но, поскольку кнопка создается программно, я не могу перейти от view2 к view2.


person hikki    schedule 04.08.2016    source источник
comment
Я думаю, вам нужно изучить разницу между представлением и контроллером представления.   -  person Wyetro    schedule 04.08.2016
comment
О, мой плохой. view1 и view 2 являются контроллерами представления.   -  person hikki    schedule 04.08.2016
comment
Вы пытались использовать presentViewController вместо PerformSegue?   -  person Wyetro    schedule 04.08.2016
comment
Нет. Что это делает? Мне нужно отправить один параметр в новый view2, поэтому я пытался использовать prepareForSegue. Извините, я не супер специалист по Swift.   -  person hikki    schedule 04.08.2016


Ответы (1)


Вы хотите использовать presentViewController вместо performSegue:

// however you want to initialize the new vc
let vc2 : View2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("view2.id") as! View2

альтернативный способ инициализации vc:

let vc2 = View2()

а затем установите данные и представьте:

vc2.index = index // whatever you want to pass
self.presentViewController(vc2, animated: true, completion: nil)

В противном случае вы можете создать новый контроллер представления в своей раскадровке, но я бы не рекомендовал этого делать.

person Wyetro    schedule 04.08.2016
comment
Но выполняет ли он переход в конце концов? Я должен пройти через prepareForSegue, прежде чем произойдет переход. - person hikki; 04.08.2016
comment
Нет, это не так, и вам не нужно. Вы можете просто передать данные перед презентацией. Я предлагаю прочитать мой ответ. - person Wyetro; 04.08.2016
comment
Если я заменю свою функцию buttonPressed вашим кодом, я получу сообщение об ошибке: Storyboard (‹UIStoryboard: 0x7a7f6350›) не содержит контроллер представления с идентификатором «view2.id». Мне очень жаль, но я потерялся с вашим ответом. Раньше я никогда не управлял раскадровкой программно, и я думаю, именно поэтому я не могу понять ваш ответ. - person hikki; 04.08.2016
comment
Да, как и ожидалось, потому что вы должны добавить идентификатор в свою раскадровку. - person Wyetro; 04.08.2016
comment
Или знаете, вы могли бы прочитать комментарий и инициализировать свой контроллер представления так, как вы хотели, а не так, как это сделал я. - person Wyetro; 04.08.2016
comment
Я прочитал ваш комментарий, но, возможно, я не правильно понял. Я подумал, пусть vc2 : View2 = UIStoryboard(name: Main, bundle: nil).instantiateViewControllerWithIdentifier(view2.id) as! View2 добавляет идентификатор как view2.id. Так что я не понимаю, я получаю ошибку - person hikki; 04.08.2016
comment
Вы должны добавить идентификатор в контроллер представления в раскадровке. Если вы не понимаете, как это сделать, я бы порекомендовал погуглить, как добавить идентификатор раскадровки в контроллер представления. - person Wyetro; 04.08.2016
comment
О, черт возьми, я понял. Спасибо за такую ​​​​помощь. - person hikki; 04.08.2016
comment
Рад, что помог! - person Wyetro; 04.08.2016