Вам нужно использовать протоколы делегирования ... Вот как это сделать:
Объявите протокол в заголовочном файле вашего второгоViewController.Это должно выглядеть следующим образом:
#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: События запуска по нескольким контроллерам представления из потока в приложении:
РЕДАКТИРОВАТЬ:
Если вы хотитеПередав несколько аргументов, код перед dismiss будет выглядеть следующим образом:
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
}