三种佳选择:
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];
而且在时机成熟时,第二控制器可以这样做:
细节并不真的那么重要 - 主要的是要知道这里是如果你想发送消息给一个对象,你首先需要一个指向该对象的指针。当第一个视图控制器设置second.thingToName = self
时,它提供该指针。
2)具有与第一视图控制器创建数据对象其中第二视图控制器可以存储数据,例如:
@interface Person <Nameable>
//...
@end
@implementation Person
@synthesize name;
//...
@end
现在第一视图控制器可以创建新的人与通即:
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];
这类似于第一种方法,只收到所述名字的东西是不是在这里的视图控制器,它是某种形式的数据容器(人)。
您也可以在此处看到协议的值 - 请注意,SecondViewController类在第一种方法和第二种方法之间完全不会改变。它不会保护无论是与视图控制器还是Person或其他实例进行通信......只要该事件实现了可命名协议,就很高兴。
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
*这是唯一“正确”的方式*这是不正确的。有许多有效的方法可以在对象之间共享数据;代表团远不是唯一“正确”的方式。 – Caleb 2011-12-22 05:05:24
够公平的,我会编辑我的答案,删除,因为你是对的。 – Rog 2011-12-22 05:14:12