Передача обьектов между 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