Има (поне) два начина да направите това:
- Използвате известие, което единият контролер слуша, а другият изпраща в подходящия момент.
- Създавате делегиран протокол, който първият контролер изпълнява, а вторият - при повиквания.
Делегираният е малко по-сложен, но като цяло се счита за добър стил. Уведомителната също не е лоша, но малко по-малко "елегантна". Ще опиша базираното на известяване тук, защото изглежда добре за вашия случай и също така би позволило да реагирате на покупката на множество места, като просто се регистрирате за известието и там.
В контролера, който има изображението за актуализиране, регистрирайте се за известие в 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", който е свързан с новото име на изображението.
person
Daniel Schneller
schedule
25.03.2013