2014-09-01 3 views
16

Я использую Swift и Xcode 6 и хотел бы передать переменную из одного контроллера View в другой с помощью Segue.Передача переменных между контроллерами View с использованием segue

Я создал segue под названием «MainToTimer», который запускается после нажатия кнопки. Я хотел бы иметь возможность использовать переменную под названием «Длительность» на втором контроллере просмотра.

Можно ли передавать несколько переменных и констант?

Какой код мне нужен для каждого контроллера просмотра?

Заранее спасибо.

+1

Возможный дубликат [Как вы передаете данные между диспетчерами просмотра в Swift?] (Http://stackoverflow.com/questions/25215476/how-do-you-pass-data-between-view-controllers-in- swift) – Paulw11

ответ

6

В первом ViewController месте это (для модального Segue):

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let theDestination = (segue.destinationViewController as ViewController2) 
    theDestination.Duration2 = Duration 
} 

Изменение ViewController2 на имя второго ViewController. В ViewController2 создать переменную класса:

var Duration2 = (whatever the type - UInt8 I guess for time) 

Вот и все. У вас будет значение Duration2 значение Duration с первых ViewController.

+0

Спасибо за ваш комментарий. Я попытался включить ваше предложение и получил ошибку. (1) в строке self.performSegueWithIdentifier («MainToTimer», длительность отправителя) Я получаю сообщение об ошибке «Turation» не соответствует протоколу «Any Object» (2) в строке theDestination.Duration2 = Duration Я получаю сообщение об ошибке - Ожидаемый имя участника или вызов конструктора после имени типа. – DanteDeveloper

+0

Извините за поздний ответ. Более поздняя версия Xcode 6 изменила метод. Я обновил его выше, и теперь он должен работать нормально. –

+0

'if (segue.identifier =" MainToTimer ") {' должен быть 'if (segue.identifier ==" MainToTimer ") {' ur сравнение, не присвоение –

38

Сначала настройте свойство/свойства, чтобы удерживать переменные в вашем втором контроллере представления (место назначения).

class YourSecondViewController: UIViewController { 
    var duration:Double? 
} 

После этого ваша кнопка запускает ваш пользовательский сегмент. Используйте переменную («продолжительность») в качестве аргумента для отправителя.

class YourFirstViewController: UIViewController { 
    @IBAction func buttonTapped(sender: AnyObject) { 
     self.performSegueWithIdentifier("MainToTimer", sender: duration) 
    } 
} 

Наконец, передать этот отправитель данных путем переопределения метода prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "MainToTimer") { 
     let secondViewController = segue.destinationViewController as YourSecondViewController 
     let duration = sender as Double 
     secondViewController.duration = duration 
    } 
} 

Да, можно также передать несколько переменных и констант, снова используя параметр «отправителя» в prepareForSegue. Если у вас есть несколько данных, которые вы хотите передать, поместите их в массив и сделайте этот массив отправителем.

+1

OK ... Я вижу, как это работает .. Я мог бы даже использовать его ... но у меня плохое чувство, потому что на самом деле это не то, для чего был разработан аргумент отправителя. Обычно я узнаю позже, почему вы не должны этого делать, но я ничего не могу придумать прямо сейчас. – wcochran