Ответ 1
Вам нужно использовать протоколы делегатов... Вот как это сделать:
Объявить протокол в файле заголовка 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
EDIT:
Если вы хотите передать несколько аргументов, код перед запуском выглядит следующим образом:
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
}