Три хороших варианта:
1) Пусть первый контроллер вида передаст себя второму контроллеру вида, , чтобы второй контроллер мог отправлять сообщения первому.В идеале, создайте протокол, который принимает первый контроллер, чтобы второй контроллер не зависел от типа первого контроллера, а заботился только о том, чтобы он реализовал протокол:
@protocol Nameable
@property(copy) NSString* name;
@end;
@interface FirstViewController <Nameable>
//...
@end
@implementation FirstViewController
@synthesize name;
//...
@end
Тогда первый контроллер можетсделайте это:
SecondViewController *second = [[SecondViewController alloc]
initWithNibName:nil]; second.thingToName = self;
[self.navigationController pushViewController:second animated:YES];
И когда придет время, второй контроллер сможет это сделать:
self.thingToName.name = nameString;
Детали не так уж и важны - главное знать здесьв том, что если вы хотите отправить сообщение объекту, вам сначала нужен указатель на объект.Когда первый контроллер представления устанавливает second.thingToName = self
, он предоставляет этот указатель.
2) Пусть первый контроллер представления создает объект данных , в котором второй контроллер представления может хранить данные, напримерthis:
@interface Person <Nameable>
//...
@end
@implementation Person
@synthesize name;
//...
@end
Теперь первый контроллер представления может создать нового Person и передать следующее:
SecondViewController *second = [[SecondViewController alloc]
Person *person = [[Person alloc] init];
[self.people addObject:person];
initWithNibName:nil]; second.thingToName = person;
[person release];
[self.navigationController pushViewController:second animated:YES];
Это похоже на первый подход, только то, что получает имя, нездесь не контроллер представления, это какой-то контейнер данных (Person).
Здесь вы также можете увидеть значение протокола - обратите внимание, что класс SecondViewController вообще не меняется между первыми вторые подходы. не волнует , разговаривает ли он с контроллером представления, экземпляром Person или чем-то еще ... до тех пор, пока объект реализует протокол Nameable, он счастлив.
3) Обратное направление связи. Вместо того, чтобы заставлять контроллер второго вида отправлять строку, у ее родителя получить строку.Это может быть самым простым решением, хотя оно требует, чтобы у родителя был какой-то способ узнать, что ребенок сделан.Это будет выглядеть примерно так:
@implementation FirstViewController
//...
- (IBAction)addNewName:(id)sender
{
self.secondController = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:self.secondController animated:YES];
}
- (void)viewWillAppear
{
if (self.secondController != nil) { // we must be returning from the child
self.name = self.secondController.name;
self.secondController = nil;
}
}
@end