三種佳選擇:
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