2016-02-11 4 views
15

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

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

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

+6

Вы можете создать segue в построителе интерфейса от VC1 до VC2, дать ему имя, а затем вызвать 'performSegueWithIdentifier' из действия, которое вы привязали к кнопке. Затем в 'prepareForSegue' вы положите оператор' if', определяющий используемый вами сегмент, возьмите все, что вы передаете из VC1, назначьте его на VC2 и BAM ... все готово. – Adrian

+0

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

ответ

26

Вы можете сделать это, как предложено в этом ответе: 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.

+0

Поскольку OP задает вопрос о создании segues из действия кнопки, создание именованного 'UIViewController' в' UIViewController' segue и вызов его с помощью функции performSegueWithIdentifier, как это предлагает @AdrianB, кажется лучшим решением. –

+0

@ DuncanC сделал хороший момент, но решение Дехлена также работает :) Я узнал два разных способа, я думаю. – Kahsn

+0

Привет, это сработало для меня, но теперь, когда я нажимаю на отмену, чтобы перемещаться назад, это не работает, любая идея может быть неправильной? –

6

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