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. Надеюсь, это поможет!

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

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

  • Как использовать inputAccessoryViewController в iOS 8
  • Заголовок контроллера навигации не отображается?
  • iOS: Как обновить UIViewController после всплытия своего дочернего UIViewController?
  • Предотвратить segue в методе prepareForSegue?
  • Подробная страница настроек iPad, такая как всплывающее окно контроля
  • Раскадровка - см. ViewController в AppDelegate
  • Как я могу уволить два модальных контроллера просмотра подряд * с анимацией *?
  • iOS для использования нескольких UITableView в одном UIViewController
  • Создание контроллера вида без наконечника
  • Клавиатура, появляющаяся вкратце при появлении viewcontroller iOS
  • Конструкторы интерфейса не отображаются
  • Interesting Posts

    Неоднозначное использование «индекса» с NSArray & JSON

    NSOperationQueue mainQueue vs performSelectorOnMainThread?

    Только отображение содержимогоОверляйплей в AVPlayerViewController, когда элементы управления отображаются

    locationManager избегает (нулевой) строки в ярлыке

    Ошибка при вводе текста в текстовом поле: _NSLayoutTreeLineFragmentRectForGlyphAtIndex неверный индекс глифа 7

    Использование неразрешенного идентификатора «GMSServices»

    Есть ли способ узнать покупку, сделанную с помощью учетной записи iTunes? – iOS

    Невозможно определить, работает ли приложение Xamarin Forms в симуляторе или на устройстве

    Изменение CSS для веб-сайта IOS

    «InvalidPathValidation» при использовании Swift 3

    «CGFloat» не конвертируется в «Double» ошибку в SWIFT (iOS)

    Perfect Swift3 Boing

    Компиляция FFTW3 для IOS 5.1 на OSX 10.7

    FFmpeg AVFrame для текстуры OpenGL без преобразования YUV в RGB

    ASIHTTPRequest / ASIFormDataRequest – ссылка объекта запроса в блоках под ARC

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