Форум программистов, компьютерный форум CyberForum.ru

Swift

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
NexNyte
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 11
#1

Как из одного View Controller передать переменную в другой - Swift

26.11.2015, 09:20. Просмотров 1887. Ответов 6
Метки нет (Все метки)

Как в swift 1.2 передать переменную из одного View Controller в другой, пробовал через segue но ничего не получается, переменная все равно остается nil. У меня в первом View Controller находится форма входа, там парсится json и одну переменную после парсинга нужно передать в другой View Controller. Версия программы XCode 6.4
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2015, 09:20     Как из одного View Controller передать переменную в другой
Посмотрите здесь:

Воспроизведение видео AV Kit Player View Controller Swift
Передать значение в TableView с сайта Swift
Не получается ассоциировать view из tabcontroller с кодом Swift
Как правильно передать ссылку в другой класс Swift
Swift Передать из UITableView в UIWebView
Swift Как из одного View передать переменную в другой?
Swift Не работает импорт одного ViewController в другой!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nkYellOw
12 / 12 / 5
Регистрация: 23.10.2012
Сообщений: 43
07.12.2015, 14:15     Как из одного View Controller передать переменную в другой #2
ViewController (VC)


Если ты открываешь VC программно то можно сделать так:
Программное открытие след VC:
Objective-C
1
2
3
4
5
6
secondVC = self.storyboard?.instantiateViewControllerWithIdentifier("mySecondViewController") as! SecondViewController
secondVC.opener = self
 
let secondNavController = UINavigationController(rootViewController: secondVC)
 
self.presentViewController(secondNavController, animated: true, completion: nil)
В открывающемся VC дописать:
Objective-C
1
var opener: ViewController! //
и потом можешь читать и изменять данные первого VC
Objective-C
1
2
3
4
// Запись
self.opener.TextField.Text = "новое значение"
//Чтение
let oldTextFiled = self.opener.TextField.Text
Подпишусь на тему, т.к. изучаю свифт и было бы круто знать как другими методами получать переменные других VC
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
07.12.2015, 18:32     Как из одного View Controller передать переменную в другой #3
nkYellOw,

Objective-C
1
2
3
4
5
let navigation = UINavigationController()
navigation.navigationBarHidden = true
self.view.window!.rootViewController = navigation
let viewc = ViewController()
navigation.pushViewController(viewc, animated: true)
В итоге UINavigationController будет контроллером всея приложухи и можно удобно взад-вперед щелкать (ну и само собой цеплять к нему глобальные переменные). По хорошему это желательно еще в делегате приложения делать, а не в контролере, но я этот первый контроллер для теста использую.

NexNyte, в вашем случае, можно в свойствах storyboard указать root controller и так же его вызывать где надо:

Objective-C
1
self.view.window!.rootViewController
Я пока больше знаком с динамическим созданием интерфейса чем с мышкотыком, но сдается мне (в случае если вы не найдете кнопки "добавить корневой контроллер" и захотите кодом) этот контроллер должен быть в самом storyboard, на него надо в свойствах повесить индификатор и создавать его через этот индификатор.

p.s. если скинете код где у вас через segue не передает ничего возможно смогу подсказать в чем дело.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
08.12.2015, 08:39     Как из одного View Controller передать переменную в другой #4
Цитата Сообщение от AncientPenguin Посмотреть сообщение
ну и само собой цеплять к нему глобальные переменные
ерунда, глобальные переменные - зло всея всеи, никогда этой фигней не занимайтесь
блин, вам надо просто запретить отвечать людям и давать такие туфтовые советы, вы просто вредительством занимаетесь

есть два подхода построения навигации в приложении:
1. Создание вью-контроллеров в Xib файлах и потом инициализация контроллеров в коде, куда в конструктор можно передать необходимые параметры\зависимости (называется Dependency Injection) это один из методов реализации данного шаблона - инъекция через конструктор.
Можно параметры передать в публичные переменные контроллера, который открываете, либо используя публичные методы.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class DestinationViewController: UIViewController {
    let parameter: String
    
    init(parameter: String) {
        self.parameter = parameter
        super.init(nibName: "DestinationViewController", bundle: nil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
 
// потом у себя в контроллере создаете и показываете его
 
let vc = DestinationViewController(parameter: "value")
presentViewController(vc, animated: true, completion: nil)
2. Создание вью-контроллеров в Storyboard-ах, там просто перегружаете метод делегата prepareForSegue:sender:
Segue - это описание переход из одного скрина на другой, у него есть имя и есть source из которого переходят, т.е. self в вашем случае и destination - куда переходят

Objective-C
1
2
3
4
5
6
7
8
9
10
// где-то там, когда нужно перейти по пути с именем MySegue, вызываете:
performSegueWithIdentifier("MySegue" sender: self)
 
// перегружаете метод и реализуете передачу параметров
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "MySegue" {
        let dest = segue.destinationViewController
        dest.parameter = "someValue"
    }
}
P.S. лично я предпочитаю создавать вью-контроллеры в xib файлах, потому что так я имею больше контроля при создании и передаче параметров. Во втором случае будет не очень удобно оперировать переходами на несколько контроллеров, т.к. в prepareForSegue:sender: прийдется паттерн матчингом перебирать все возможные переходы с source скрина и там передавать параметры только либо через публичные проперти destination контроллера либо через его публичные методы

P.P.S. на самом деле есть и третий вариант, когда можно миксовать сториборды и xib файлы или просто программное создание, но тогда каша получается и я стараюсь придерживаться одного стиля
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
08.12.2015, 22:11     Как из одного View Controller передать переменную в другой #5
Цитата Сообщение от Vorona Посмотреть сообщение
ерунда, глобальные переменные - зло всея всеи, никогда этой фигней не занимайтесь
блин, вам надо просто запретить отвечать людям
UIApplication.sharedApllication() - глобальная переменная. Теперь вы побежите доказывать эплу что они раки или все же признаете что вы балабол?

Добавлено через 9 минут
Перечитал еще раз, блин все же придется намекнуть, сами вы не увидите (думаю вы вообще не вникали в мое сообщение). Я имел ввиду не глобальную переменную с точки зрения ЯП swift, а глобальную переменную с точки зрения логики, о чем можно было догадаться читая:

Цитата Сообщение от AncientPenguin Посмотреть сообщение
(ну и само собой цеплять к нему(к рут контроллеру) глобальные переменные)
Что по сути человек со знаниями программирования (а не с заученным учебником) может перевести как:
Создать синглтон-приложение и поместить туда все что нужно всему приложению (или перекидывать через него куски информации между контроллерами если нет лучше способа).
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
08.12.2015, 22:59     Как из одного View Controller передать переменную в другой #6
Цитата Сообщение от AncientPenguin Посмотреть сообщение
UIApplication.sharedApllication()
это не глобальная переменная, а переменная локальная, для текущего аппа и она не мутабельна (readonly), понимаете разницу?
глобальные переменные, которые может обновлять кто угодно и откуда угодно и непонятно когда угодно, это ад.

Цитата Сообщение от AncientPenguin Посмотреть сообщение
Я имел ввиду не глобальную переменную с точки зрения ЯП swift, а глобальную переменную с точки зрения логики, о чем можно было догадаться читая
я прекрасно понял о чем вы сказали, и потому говорю, что это решение не правильное в корне в данной задаче, т.к. есть альтернативы, которые решают задачу, соответствуя шаблонам и принципам проектирования.

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

Чаще всего я использую глобальные состояния для чтения, но не для записи, запись должна происходить почти во всех случаях из одного проверенного источника и все подряд не должны иметь таких полномочий, потому что вы тогда и через неделю не разгребете всю путанницу, а если на проект прийдет еще Вася и Петя, тогда вы зафейлитесь еще на второй итерации.

Цитата Сообщение от AncientPenguin Посмотреть сообщение
или перекидывать через него куски информации между контроллерами если нет лучше способа
способы почти всегда есть, нужно просто не лениться немного подумать над решением
как минимум, я показал одни из самых приемлемых способов передачи данных между контроллерами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2015, 23:15     Как из одного View Controller передать переменную в другой
Еще ссылки по теме:

Как инициализировать глобальную переменную внутри блока if Swift
Как задать минимальную высоту ячейки в table view? Swift
Выбор View Swift

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
08.12.2015, 23:15     Как из одного View Controller передать переменную в другой #7
Цитата Сообщение от Vorona Посмотреть сообщение
это не глобальная переменная, а переменная локальная, для текущего аппа и она не мутабельна (readonly), понимаете разницу?
глобальные переменные, которые может обновлять кто угодно и откуда угодно и непонятно когда угодно, это ад.
Простите ошибся, глобальная константа, но это поменять одни три буквы на другие и все работает (передавать данные через специальный объект).

Цитата Сообщение от Vorona Посмотреть сообщение
синглтоны и прочая глобальная хрень может быть иногда и хороша, но вы должны очень хорошо понимать, что делаете и 10 раз подумать или это нельзя решить без глобальных состояний.
Если не должно запускаться много копий приложения то синглтон - приложение, иначе синглтон - менеджер приложений. Больше одного я никогда не делал.

Цитата Сообщение от Vorona Посмотреть сообщение
способы почти всегда есть, нужно просто не лениться немного подумать над решением
как минимум, я показал одни из самых приемлемых способов передачи данных между контроллерами.
Я написал хоть какой то, и написал что мог бы помочь с segue если покажут код который не работает, но вы были уверены что я не должен был писать вообще.
Yandex
Объявления
08.12.2015, 23:15     Как из одного View Controller передать переменную в другой
Ответ Создать тему
Опции темы

Текущее время: 03:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru