Статьи

Передача данных между контроллерами в Swift

Swift — это замечательный язык программирования, который Apple представила во время WWDC 2014, и теперь почти все разработчики Apple используют его для программирования приложений iOS и OS X. Он очень гибкий, более простой в использовании, чем его предшественник Objective C, и сэкономит вам драгоценные минуты при кодировании с помощью XCode.

Это мощный и интуитивно понятный язык программирования для iOS, OS X, tvOS и watchOS. Написание кода Swift интерактивно и увлекательно, синтаксис лаконичен, но выразителен, а Swift включает в себя современные функции, которые любят разработчики. Если вы еще не используете Swift, ознакомьтесь с некоторыми другими нашими великолепными учебниками по языку Swift:

  • IOS
    iOS с нуля с Swift: создание вашего первого приложения для iOS
    Барт Джейкобс
  • стриж
    iOS с нуля с помощью Swift: Swift в двух словах
    Барт Джейкобс
  • стриж
    И работает с Swift 2
    Дерек Дженсен

В большинстве случаев, когда вы создаете приложение для iOS с несколькими экранами, вам нужно передавать данные между вашими контроллерами представления, чтобы они могли обмениваться контентом, не теряя их в процессе. В этом уроке вы узнаете, как это сделать. Мы будем использовать String , Integer , а также UIImage , так что продолжайте читать — вы будете удивлены, насколько легко эта работа с Swift.

Прежде всего, создайте новый проект XCode. Выберите Single View Application и назовите проект так, как вам нравится. Вы найдете файл ViewController.swift в списке файлов на левой панели и интерфейс контроллера в раскадровке.

Начните с перетаскивания нового View Controller из библиотеки объектов на раскадровку.

Раскадровка, показывающая новый View Controller

Вставьте ваш первый контроллер в NavigationController , чтобы при переходе к следующему контроллеру в верхней панели отображалась кнопка « Назад» по умолчанию. Теперь выберите первый контроллер в раскадровке и нажмите « Редактор» > « Встроить в …» > « Контроллер навигации» .

Выбор контроллера навигации из меню редактора

Теперь добавьте UILabel и UIButton к контроллеру. Вы можете найти их в библиотеке объектов и перетащить в ваш первый контроллер. Затем дважды щелкните UILabel и введите текст, который вы хотите передать второму контроллеру. Я только что установил его текст « Текст для передачи ».

На втором контроллере перетащите новую UILabel куда хотите и просто оставьте текст таким, какой он есть.

Новый UILabel во втором контроллере

Теперь нам нужно создать новый файл .swift и прикрепить его ко второму контроллеру. Итак, щелкните правой кнопкой мыши на панели списка файлов слева, выберите « Новый файл …» , выберите « Какао Touch Class» из категории « Источник iOS », нажмите « Далее» и назовите новый контроллер представления SecondVC . (В имени не должно быть пробелов, и оно должно начинаться с заглавной буквы.)

Выбор нового файла из меню
Выбор параметров для нового файла

Теперь вам нужно связать второй контроллер в раскадровке с вашим новым файлом SecondVC.swift . Выберите желтый кружок в верхней части контроллера, щелкните значок панели « Определить инспектор» в правой части окна XCode и введите имя нового файла .swift в полях Class и StoryboardID .

связывание второго контроллера в раскадровке с вашим новым файлом SecondVCswift

Разбейте окно XCode на две части, нажав кнопку « Помощник редактора» в правом верхнем углу. Теперь у вас будет раскадровка слева, а соответствующий файл .swift — справа.

Окно XCode разделено на две части

Соедините UILabel как IBOutlet и UIButton как IBAction с вашим файлом .swift , удерживая правую кнопку мыши (или клавишу Control и кнопку мыши) над этими представлениями и перетаскивая синюю линию прямо под объявлением class .

Когда вы отпустите кнопку мыши, вы можете дать название выходу ярлыка и действию кнопки в маленьком сером всплывающем окне, которое появляется. Для кнопки обязательно нажмите на маленькое поле со списком Outlet и переключите его в действие , потому что нам нужно, чтобы это была функция, а не выход.

Снимок экрана, показывающий, куда можно перетащить синюю линию
дать название выходу ярлыков и действию кнопок
Выберите Аутлет, а не Действие

Как только вы закончите соединять все представления, разделите окно XCode на две части и выберите первый контроллер на раскадровке. Теперь с правой стороны отобразится файл ViewController.swift, и вы будете готовы написать в нем некоторый код.

Поместите следующий код в метод goButton() .

1
2
3
let myVC = storyboard?.instantiateViewControllerWithIdentifier(«SecondVC») as!
myVC.stringPassed = myLabel.text!
navigationController?.pushViewController(myVC, animated: true)

Первая строка создает экземпляр контроллера SecondVC из раскадровки.

Вторая строка на самом деле является ядром этого учебника, потому что она назначает текст UILabel для UILabel мы поместили в контроллер SecondVC . Это делается путем установки String которую мы собираемся объявить позже.

Затем, наконец, мы просто перемещаем представление к следующему контроллеру.

Теперь выберите другой контроллер в Storyboard и добавьте эту переменную прямо под SecondVC класса SecondVC :

1
var stringPassed = «»

Заставьте приложение присвоить значение этой переменной secondLabel со следующей строкой кода в viewDidLoad() .

1
secondLabel.text = stringPassed

Вы сделали! Запустите приложение на iOS Simulator или на реальном устройстве, нажмите GO! и вы должны получить что-то вроде этого:

Приложение показывает текст для передачи

Как видите, текст для передачи String успешно передан нашему контроллеру SecondVC .

Теперь давайте попробуем добавить целое число ( Int в Swift) и разделить его между двумя контроллерами.

Добавьте следующую переменную в ViewController.swift , прямо под объявлением myLabel Outlet.

1
var myInt = Int()

Инициализируйте его значение в viewDidLoad() :

1
2
3
4
5
override func viewDidLoad() {
    super.viewDidLoad()
 
    myInt = 5
}

Затем отредактируйте goButton() , добавив экземпляр, который также myInt значение myInt следующему контроллеру следующим образом:

1
2
3
4
let myVC = storyboard?.instantiateViewControllerWithIdentifier(«SecondVC») as!
myVC.stringPassed = myLabel.text!
myVC.intPassed = myInt
navigationController?.pushViewController(myVC, animated: true)

Теперь перейдите в SecondVC.swift и сначала добавьте переменную типа Int , которая получит число, которое мы отправим с первого контроллера. Поместите эту строку кода прямо под переменной stringPassed .

1
var intPassed = Int()

Отредактируйте строку кода secondLabel следующим образом:

1
secondLabel.text = stringPassed + » my Int: \(intPassed)»

Это все. Запустите приложение еще раз и нажмите GO! кнопку, и вы должны получить что-то вроде этого:

Экран приложения с текстом для прохождения моего Int 5

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

Далее нам нужно добавить изображение в Активы   папка в XCode, UIImageView в обоих контроллерах и их относительных переменных типа UIImage .

Войдите в синюю папку Assets.xcassets и создайте новый набор изображений .

Новый набор изображений

Перетащите изображения 3x, 2x и 1x в соответствующие поля. Вы можете использовать любое изображение. Я использовал логотип Apple в качестве примера.

3x 2x и 1x изображения в соответствующих полях

Вернитесь к первому контроллеру в раскадровке и перетащите UIImageView куда-нибудь в нем. Прикрепите к нему свое изображение с помощью панели инспектора атрибутов и установите для его режима значение « Подгонка по размеру» .

Теперь перетащите новый UIImageView во второй контроллер и установите его режим в Aspect Fit. Не назначайте ему изображения, потому что мы передадим изображение с первого контроллера!

установка режима в формат

Щелкните правой кнопкой мыши (или удерживайте Control и нажмите кнопку мыши) и перетащите синюю линию в файл .swift первого контроллера, чтобы объявить UIImageView в качестве IBOutlet . Сделайте то же самое и на втором контроллере.

объявить ваш UIImageView как IBOutlet
То же самое на втором контроллере

Теперь вам нужно добавить переменную UIImage в файл SecondVC.swift . Поместите его под переменную intPassed .

1
var theImagePassed = UIImage()

В viewDidLoad() захватите изображение, переданное первым контроллером, и отобразите его с помощью imagePassed .

1
imagePassed.image = theImagePassed

Наконец, отредактируйте метод goButton() , добавив строку кода, которая передаст изображение первого контроллера в UIImageView второго. Полный goButton() теперь выглядит следующим образом.

1
2
3
4
5
let myVC = storyboard?.instantiateViewControllerWithIdentifier(«SecondVC») as!
myVC.stringPassed = myLabel.text!
myVC.intPassed = myInt
myVC.theImagePassed = myImage.image!
navigationController?.pushViewController(myVC, animated: true)

Запустите приложение, нажмите GO! снова, и вы должны увидеть что-то вроде этого:

Экран приложения с текстом для прохождения моего логотипа Int 5 и Apple

Спасибо за подписку! Я надеюсь, что вы удивлены тем, как легко обмениваться переменными и изображениями между двумя контроллерами.

Мы создали полное руководство, которое поможет вам изучить Swift , независимо от того, начинаете ли вы с основ или начинаете изучать более сложные темы.

Вы также можете проверить некоторые другие наши учебники по Xcode и Swift!

  • стриж
    Функция каррирования в Swift
    Дэвис Элли
  • стриж
    Как использовать дженерики в Swift
    Мэтью Ким
  • Xcode 7
    Прогресс в тестировании с Xcode 7 и Swift 2
    Барт Джейкобс