有(至少)两种方法可以做到这一点:
- 您使用一个控制器监听而另一个控制器在适当的时间发送的通知。
- 您创建一个委托协议,第一个控制器实现,第二个调用。
委托人有点复杂,但通常被认为是好的风格。通知也不错,但“优雅”稍差。我将在此处描述基于通知的通知,因为它似乎适合您的情况,并且还允许通过在多个地方注册通知来对购买做出反应。
在要更新图像的控制器中,在以下位置注册通知viewDidAppear:
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateImage:) name:@"UpdateImageNotification" object:nil];
实现updateImage:
方法:
-(void)updateImage:(NSNotification*)note
{
NSString* newImageName = note.userInfo[@"imageFileKey"];
// ... update UI with the new image
}
还要确保在视图消失时取消注册该通知:
-(void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewWillDisappear:animated];
}
在另一个触发更新的控制器中,在适当的位置触发通知:
-(IBAction)purchase:(id)sender
{
// ...
NSDictionary* userInfo = @{@"imageFileKey" : newImageName};
[[NSNotificationCenter defaultCenter]
postNotificationName:@"UpdateImageNotification"
object:self userInfo:userInfo];
// ...
}
通知上下文中的object
参数用于指定是否要通过任何对象或仅通过非常特定的实例来收听通知。在许多情况下,实际实例并不相关,但您只需通过名称来识别通知(如本例中的“UpdateImageNotification”)。
该userInfo
词典旨在携带您需要随通知提供的任何信息。这就是为什么我介绍了一个与新图像名称相关联的键“imageFileKey”。