22 Eylül 2012

Objective-C NSNotificationCenter ile veri aktarma

ile hasan

Objective-c’de iki ekran (yani iki viewController) arasında veri alışverişi yapmak için çeşitli yöntemler var. A ekranı B ekranını çağırıyorsa çağırmadan evvel B’deki bir değişkene değer atayabiliyoruz. Bu konuya dair yazımızı inceleyebilirsiniz.

Bu yazımızda ise modal olarak çağırılan B ekranında işimiz bittiğinde A ekranına veri aktarmanın bir yöntemi olan NSNotificationCenter’e örnek vereceğiz.

NSNotificationCenter isminden de anlaşıldığı üzere program esnasında herhangi bir ekrandayken “bir şey oldu!” demenin yoludur. İşte daha yolun başındayken programımızda diyoruz ki; “falan şey” olursa şu fonksiyonu çağır. Her ekranda “falan şey” olduğunda farklı fonksiyonların devreye girmesini tanımlayabiliyoruz.

Örneğimizde AviewController içerisinde BviewController’i çağırdığımızı, B’de bazı işlemler yaptıktan sonra kapatıp A’ya geri döndüğümüzü ve B’deki işlemin neticesinde A’ya bir değer döndürmek istediğimizi ele alalım.

Önce AviewController.m dosyasında notification’ımızı kaydedip hangi durumda hangi fonksiyonun çalışacağını belirtmeliyiz:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sonucuGoster:) name:@"islemTamam" object:nil];

Burada demiş oluyoruz ki A ekranındayken ne zaman “islemTamam” diye bir notifikasyon gelirse sonucuGoster: fonksiyonunu çağır. sonucuGoster: fonksiyonu notifikasyon objesini karşılayacak şekilde parametre almalıdır. Şöyle ki:

- (void) sonucuGoster:(NSNotification *)notification{
    NSString *sonuc= [notification object];
    sonucLabel.text=sonuc;
}

Burada sonuc değişkeni notifikasyon objesi ile gelmektedir. BviewController.m dosyasında BviewController’i kapatmadan hemen önce notifikasyonu şöyle setlemeliyiz.

 [[NSNotificationCenter defaultCenter] postNotificationName:@"islemTamam" object:@"sonuc: 999"];
 [self dismissModalViewControllerAnimated:YES];

Böylece BviewController kapanmadan evvel “islemTamam” çağrısı yapacak, AviewController’da önceden ayarlandığı üzere bu çağrıyı yakalayıp sonucuGoster: fonksiyonunu çalıştıracak. Bu fonksiyon da parametre olarak notifikasyon’u object’i ile beraber alacak. Object olarak herhangi bir nesneyi gönderebiliriz. Bu örnekte string bir değer gönderdik.