Сделать программно Segue в Swift

У меня два VC: VC1 и VC2. В VC1 у меня есть finish button, который я программно сделал, и result array я хочу перейти на VC2.

Я знаю, как сделать Segue в Storyboard, но я не могу этого сделать в этот момент, так как finish button программно сделан.

Если я хочу передать массив результатов с помощью segue, есть ли способ сделать segue программным путем? Если это невозможно, следует ли просто представить VC2 с помощью presentViewController и установить делегат для передачи result array?

Ответы

Ответ 1

Вы можете сделать это, как это предлагается в этом ответе: InstantiateViewControllerWithIdentifier.

Кроме того, я предоставляю вам код из связанного ответа, перезаписанного в Swift, потому что ответ в ссылке был первоначально написан в Objective-C.

let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as! SecondViewController

vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)

EDIT:

Поскольку этот ответ привлекает некоторое внимание, я думал, что предоставил вам еще один отказоустойчивый способ. В приведенном выше ответе приложение будет аварийно, если ViewController с "идентификатором" не имеет тип SecondViewController. В Swift вы можете предотвратить этот сбой с помощью необязательной привязки:

guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else {
    print("Could not instantiate view controller with identifier of type SecondViewController")
    return
}

vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)

Таким образом, ViewController выталкивается, если он имеет тип SecondViewController. Если невозможно передать на SecondViewController, сообщение будет напечатано, и приложение останется на текущем ViewController.

Ответ 2

Вы все же можете создать segue в Interface Builder, перетащив его с VC1 на VC2 - просто перетащите из/в маленький желтый круг в верхней части VC. Дайте этому segue уникальное имя в IB, а в вашей функции finish вы можете позвонить performSegueWithIdentifier:, передать имя своего сегмента и что это. В методе prepareForSegue вы можете узнать, какой segue выполняется, обратившись к segue.identifier, и если в этом вопросе вы можете получить указатель на segue.destinationViewController и передать свои данные таким образом.