returnModalViewController И передать данные обратно

У меня есть два контроллера вида, firstViewController и secondViewController . Я использую этот код для переключения на мой второй монитор (я также передаю ему строку):

secondViewController *second = [[secondViewController alloc] initWithNibName:nil bundle:nil]; second.myString = @"This text is passed from firstViewController!"; second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentModalViewController:second animated:YES]; [second release]; 

Затем я использую этот код в secondViewController для переключения на firstViewController:

 [self dismissModalViewControllerAnimated:YES]; 

Все это прекрасно. Мой вопрос: как передать данные в firstViewController? Я хотел бы передать другую строку в firstViewController из secondViewController.

Я ценю любую помощь. Спасибо, парни.

4 Solutions collect form web for “returnModalViewController И передать данные обратно”

Вам нужно использовать протоколы делегатов … Вот как это сделать:

Объявите протокол в файле заголовка secondViewController. Он должен выглядеть так:

 #import <UIKit/UIKit.h> @protocol SecondDelegate <NSObject> -(void)secondViewControllerDismissed:(NSString *)stringForFirst @end @interface SecondViewController : UIViewController { id myDelegate; } @property (nonatomic, assign) id<SecondDelegate> myDelegate; 

Не забудьте синтезировать myDelegate в файле реализации (SecondViewController.m):

 @synthesize myDelegate; 

В своем файле заголовка FirstViewController подпишитесь на протокол SecondDelegate, выполнив следующие действия:

 #import "SecondViewController.h" @interface FirstViewController:UIViewController <SecondDelegate> 

Теперь, когда вы создаете экземпляр SecondViewController в FirstViewController, вы должны сделать следующее:

 // If you're using a view controller built with Interface Builder. SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]]; // If you're using a view controller built programmatically. SecondViewController *second = [SecondViewController new]; // Convenience initializer that uses alloc] init] second.myString = @"This text is passed from firstViewController!"; second.myDelegate = self; second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentModalViewController:second animated:YES]; [second release]; 

Наконец, в файле реализации вашего первого контроллера представления (FirstViewController.m) реализуется метод SecondDelegate для secondViewControllerDismissed:

 - (void)secondViewControllerDismissed:(NSString *)stringForFirst { NSString *thisIsTheDesiredString = stringForFirst; //And there you have it..... } 

Теперь, когда вы собираетесь отклонить второй контроллер представления, вы хотите вызвать метод, реализованный в первом контроллере представления. Эта часть проста. Все, что вы делаете, – в вашем втором контроллере представления добавить код перед кодом увольнения:

 if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)]) { [self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"]; } [self dismissModalViewControllerAnimated:YES]; 

Протоколы делегатов являются ЧРЕЗВЫЧАЙНЫМИ, ЧРЕЗВЫЧАЙНЫМИ, Чрезвычайно полезными. Было бы хорошо ознакомиться с ними 🙂

NSNotifications – это еще один способ сделать это, но, как наилучшая практика, я предпочитаю использовать его, когда хочу общаться через несколько viewControllers или объектов. Вот ответ, который я опубликовал ранее, если вам интересно использовать NSNotifications: запуск событий через несколько диспетчеров просмотра из потока в appdelegate

РЕДАКТИРОВАТЬ:

Если вы хотите передать несколько аргументов, код перед запуском выглядит следующим образом:

 if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)]) { [self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject]; } [self dismissModalViewControllerAnimated:YES]; 

Это означает, что реализация метода SecondDelegate внутри вашего firstViewController будет выглядеть так:

 - (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2 { NSString thisIsTheDesiredString = stringForFirst; NSObject desiredObject1 = inObject1; //....and so on } 

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

 @property (nonatomic, copy) void (^somethingHappenedInVC2)(NSString *response); 

Затем, когда что-то происходит в vc2, о котором вы хотите сообщить vc1, просто выполните блок, который вы определили в vc1!

 self.somethingHappenedInVC2(@"Hello!"); 

Это позволяет отправлять данные с vc2 обратно в vc1. Также как магия. IMO, это намного проще / чище, чем протоколы. Блоки являются удивительными и должны быть охвачены как можно больше.

EDIT – улучшенный пример

Допустим, у нас есть mainVC, что мы хотим представить modalVC поверх временно, чтобы получить некоторый вклад от пользователя. Чтобы представить этот modalVC из mainVC, нам нужно выделить / инициализировать его внутри mainVC. Довольно простой материал. Хорошо, когда мы создаем этот объект modalVC, мы также можем установить на нем свойство блока, которое позволяет нам легко обмениваться данными между обоими объектами vc. Итак, давайте возьмем пример сверху и поместим свойство follwing в файл .h modalVC:

  @property (nonatomic, copy) void (^somethingHappenedInModalVC)(NSString *response); 

Затем, в нашем mainVC, после того, как мы выделим / init'd новый объект modalVC, вы установите свойство block modalVC следующим образом:

 ModalVC *modalVC = [[ModalVC alloc] init]; modalVC.somethingHappenedInModalVC = ^(NSString *response) { NSLog(@"Something was selected in the modalVC, and this is what it was:%@", response); } 

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

Наконец, в нашем modalVC мы могли бы иметь tableViewController, который поддерживается массивом dataSource строк. После выбора строки мы можем сделать что-то вроде этого:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *selectedString = self.dataSource[indexPath.row]; self.somethingHappenedInModalVC(selectedString); } 

И, конечно, каждый раз, когда мы выбираем строку в modalVC, мы собираемся получить консольный вывод из нашей строки NSLog в mainVC. Надеюсь, это поможет!

хм, ищите центр уведомлений и передавайте информацию в уведомлении. вот яблоки берут на себя – я принимаю этот подход лично, если у кого-то нет других предложений

Определите протокол делегата во втором контроллере представления и сделайте первый делегат второго.

  • Как обновить дочерние контроллеры при добавлении / удалении с контроллера контейнера?
  • Добавьте элемент кнопки левой панели в UINavigationController, если нет кнопки возврата
  • Медленное время загрузки UIViewController (медленное предупреждение ClientState)
  • Почему не рекомендуетсяContentSize, используемый iPhone 6 Plus Landscape?
  • Разница между контроллером навигации и диспетчером просмотра?
  • Как отклонить контроллеры представлений в любое время (даже во время переходов) или когда можно с уверенностью закрыть диспетчер представлений?
  • Иерархия вложенных представлений iOS для поддержки функции перетаскивания, позволяющая конечным пользователям настраивать формы
  • `pushViewController: анимированный:` с анимацией затухания (только для анимации)?
  • Как отключить жестов салфетки UIPageViewController?
  • кто выпускает мою UIKeyboardDidHideNotification?
  • Как нажимать кнопку «Назад» в UINavigationController программно
  • Interesting Posts

    Как сохранить веб-приложение iPhone / iPad в полноэкранном режиме?

    Получить текущее местоположение пользователя google api не работает

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

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

    Как распространять несколько версий моего приложения?

    Распространение приложения iOS внутри компании

    Как сгенерировать проект xcode статических libs для IOS с помощью Cmake?

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

    AutoLayout устанавливает одинаковое высоту и верхнее пространство для нескольких видов, не распределяя их по вертикали

    XCode / Objective C условная точка останова на основе вызывающего абонента

    Просмотр не анимации с помощью Autolayout

    Как добавить и использовать существующую базу данных SQLite (x.db) с помощью Coredata?

    Флип-макет на iPhone для языков RTL

    Расширение iOS Share vs Action App Extension

    Потоковая передача HTTP с использованием шифрования

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.