Передача обьектов между UI\w*View

Опять взялся за ковыряние iOS. Постараюсь внятно описать три способа передачи обьекта из одного UI\w*View(UIViewController, UITableViewContoller…) в другой.

  • перед отображением новой вьюхи без Storyboard
  • перед отображение с использованием Storyboard
  • передача обьекта на предыдущую вьюху

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

Я здесь буду описывать все с использованием Storyboard, но в примера вы найдете реализацию для обоих вариантов. Для начала нам нужно добавить еще один View Controller и указать наш класс для него. В примере я на первом экране сделал обычную статическую таблицу и все действия по показу других экранов завязаны на кнопку в строке . Storyboard у меня выглядит вот так (вторая строка таблици будет показывать вьюху без использования Storyboard, поэтому у нее нет связи)

И того, в заголовочный файл добавляем атрибут text типа NSString (в примере это файлы ReceiverViewController.h и Receiver2ViewController.h)

@property (nonatomic) NSString *text;

А в основном контролере пробрасываем значение из нашего поля воода во премя подготовки к переходу между экранами

if ([[segue identifier] isEqualToString:@"PassToStoryboard"]) {
    ReceiverViewController *view = segue.destinationViewController;
    view.text = self.passToStoryboardTextField.text;
}

Теперь когда все это запустить мы сможем ввести какой-то текст в первое текстовое поле и при нажатии на букву “i” увидим этот же текст но уже на новом экране. Для передачи данных на вьюху которая открыта текущую самым правильным методом будет обьявить протокол делегата с одним единственным методом котороый будет вызывать при обновлении текстового поля и слушать в основной вьюхе.

В заголовочном файле дочерней вьюхи обьявляем протокол SenderViewControllerDelegate

@class SenderViewController;

@protocol SenderViewControllerDelegate

- (void)senderViewController:(SenderViewController *)viewController textUpdated:(NSString *)text;

@end

и добавляем атрибут делегата

@property (weak, nonatomic) id  delegate;

на событие “Editing Did End” текстового поля вызываем метод нашего протокола

[self.delegate senderViewController:self textUpdated:self.text.text];

в основной вьюхе при переходе на дочернюю что будет передавать нам значения указываем себя как ее делегата

SenderViewController *view = segue.destinationViewController;
view.delegate = self;

и обрабатываем тот единственный метод который бы обьявили что бы получить значение

- (void)senderViewController:(SenderViewController *)viewController textUpdated:(NSString *)text {
    self.receiveLabel.text = text;
}

исходники примера доступны на GitHub