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

Swift

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

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

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

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

Как из одного View передать переменную в другой? - Swift
Еще раз здравствуйте, программисты, подскажите пожалуйста как из одного View передать переменную в другой? У меня есть...

Смена Root View Controller в Navigation Controller - Программирование iOS
Доброго времени суток. В приложении есть Storyboard. В нем navigation controller выставлен как initial view controller. При первом...

По нажатию кнопки на View Controllere открыть Table View Controller - Программирование iOS
Как по нажатию кнопки на View Controllere открыть Table View Controller

Вместо navigation bar с table view хочу сделать просто view controller - Программирование iOS
добрый вечер. В xcode есть стандартный темплейт с navigation controller, но там по дефолту table view controller (master controller)...

Как создать переход на Split View Controller (Storyboard) - Программирование iOS
Уважаемые форумчане! Я пишу программу для iPad, где необходимо совершить переход с ViewController на SplitViewController, ну или любым...

View Controller Scene - Программирование iOS
Еще раз всем Доброго времени суток.Вопрос у меня есть один View Controller Scene (на нем кнопка) я кидаю второй View Controller Scene как...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nkYellOw
13 / 13 / 5
Регистрация: 23.10.2012
Сообщений: 43
07.12.2015, 14:15 #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
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
07.12.2015, 18:32 #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 не передает ничего возможно смогу подсказать в чем дело.
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
08.12.2015, 08:39 #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 файлы или просто программное создание, но тогда каша получается и я стараюсь придерживаться одного стиля
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
08.12.2015, 22:11 #5
Цитата Сообщение от Vorona Посмотреть сообщение
ерунда, глобальные переменные - зло всея всеи, никогда этой фигней не занимайтесь
блин, вам надо просто запретить отвечать людям
UIApplication.sharedApllication() - глобальная переменная. Теперь вы побежите доказывать эплу что они раки или все же признаете что вы балабол?

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

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

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

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

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

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

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

Цитата Сообщение от Vorona Посмотреть сообщение
способы почти всегда есть, нужно просто не лениться немного подумать над решением
как минимум, я показал одни из самых приемлемых способов передачи данных между контроллерами.
Я написал хоть какой то, и написал что мог бы помочь с segue если покажут код который не работает, но вы были уверены что я не должен был писать вообще.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2015, 23:15
Привет! Вот еще темы с ответами:

Заполнение Table View Controller - Программирование iOS
Доброе время суток. По нажатию кнопки осуществляется переход с View Controller на Table View Controller. Как мне заполнить строки этого...

Работа с view controller в xcode 6 - Программирование iOS
Понимаю что вопрос наиглупейший, но всё же он есть, и мне не найти ответ. Собственно, есть view controller главной страницы, с...

Table View Controller не видно ячеек - Программирование iOS
Здравствуйте. Я новичек и решил начать с чтения данной ссылки...

Воспроизведение видео AV Kit Player View Controller - Swift
Как воспроизвести видео в swift'e используя AV Kit Player View Controller


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.12.2015, 23:15
Ответ Создать тему
Опции темы

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