Delegate nedir, nasıl kullanılır? 🔁

Şule Turp
NSIstanbul
Published in
4 min readNov 8, 2017

Merhaba, bugün delegate hakkında bildiklerimi paylaşmak istedim. Belki birilerine yardımım dokunur diyorum ve başlıyorum.

Delegate, bir nesnenin programda karşılaştığı bir olay sonrasında gorevini farklı bir nesneye devredebilmesini sağlar. Kendi yarattığımız classlarda delegate kullanabileceğimiz gibi Foundation, UIKit, AppKit ve diğer Cocoa ve Cocoa Touch frameworklerinde de yaygın şekilde kullanılmaktadır.

Bir nesne gerçekleştirmek istediği görevi devreder (delegator), bir diğer nesne de o görevi devralarak gerçekleştirir (delegate). Nesneler arasındaki bu görev devri Delegate olarak adlandırılır.

Delegate’i 2 açıdan ele alarak anlatmanın yararlı olacağını düşünüyorum. Ilk örnekte kendimiz delegate yapısı kurup kullanacağız, sonraki örnekte ise UIKit frameworkünün bize sağladığı delegate metodlarını kullanacağız.

Protocol 📜

Delegate’i anlayabilmek için bilmemiz gereken bir diğer konu ise Protocol. Protocol’e gercekleştirilmesi gereken metodlar listesidir diyebiliriz. Içerisinde Required ve Optional türden metodlar bulunur. Eğer farklı bir class bu protokolü kabul ediyorsa, required tanımlanan metodların tamamını kendi classında gercekleştirmek zorunda, optional olan metodları gercekleştirmek ise şart değil.

B classının BDelegate isminde bir protokolü olsun.

B classinin h dosyasinda bunlari yazmaliyiz. Cunku farkli bir classtan bu protocol’u kullanmak isteyecegiz.

A Class’i BDelegate isimli protokolü kabul ediyorsa aşağıdaki gibi < > işaretleri arasında yazar. Artık kabul ettiğine göre verilen kılavuzu yerine getirmeli. Required olan metodları derhal uygulamalı.

Kabul islemi A classinin h dosyasinda yazilmaktadir.

Dırırım zaten akıllı xCode’umuz da diyor ki bak sen bu protokolü kabul ettin ancak metodları gercekleştirmemişsin hala? Hemen protokolü sağla.

Required metodlari tanimlayana dek bu uyariyi gorursunuz.
Hop hata gitti. Hatta dedim ki bu protocol metodu calistiginda benim labelimin textini degistirsin.

Buraya kadar sorunuz var mı? Yok çünkü zaten açık anlattım. (Şaka tabii ki sorular icin yorum bırakabilirsiniz)

Simdi neden Delegate diye girip protocol anlattık? Çünkü kendi yazdığımız delegatelerde protokol sayesinde görev devri sağlıyoruz. Nasıl mı? Şöyle ki;

A ve B classlarım olsun. Eğer A classından yapacağım bir işlem sayesinde B classında bir şey tetiklemek isteseydim bunu aracı bir metod sayesinde yapabilirdim. A classı B classını görüntüleyebilmek için (push veya present) zaten B classını yaratacaktır. Yani bu durumda A classı B classını tanımaktadır. Ve b classında herhangi bir işlem yaptırabilir.

Ancak B classında yapacağım bir islem sayesinde A tetiklenmek isterse A’yı B yaratmadığı için bunu başaramaz. Zaten önceki classı görüntüleme (pop ve dismiss) işlemlerinde de A nesnesi kullanmadan bu işlemi gerçekleştiriyoruz. Yani B’nin A’yı bilmesine gerek yok, ama orada bir işlem tetiklemesine gerek varsa şu örnekteki gibi yapıyoruz;

B classı üzerinde de bir buton olsun. Bu butona tıkladığım anda A classında bir işlem gerçekleşsin. Bu işlem de A’nın labelini değiştirme işlemi olsun. Ama ben A nesnesini bilmiyorum, B classının nesnesiyle nasıl A’ya yaptıracağım? Tabii ki delegate ile.

Delegate 🔙

Bu senaryoda delegate’i uygulayabilmek için olması gerekenler;

  • B classının bir protocol’u olur.
  • A classi bu protocol’u kabul eder ve metodlarini uygular. Bu metodlar icerisinde ise tetiklenmesini istedigi olaylari yazar.
  • B classının h dosyasında bir id tipinde ve weak bir property’si olur. Ismi delegate olur. (genelde)
  • A classı next butonuna basıldığında B’yi yaratır ve onu push ile görüntüler. Görüntüleme işlemini yaparken de hemen altında der ki B’nin delegate’i benim.
  • Ardından B görüntülenir. B de butonun action metodu içerisinde benim delegateimin su metodunu gerçekleştir dediği anda, delegate olan classta islem tetiklenir ve gerçekleştirilir.

Bu örneği incelerken yukarıdaki adımları tekrar okumanızı öneririm.

BViewController.h
AViewController.h
AViewController.m
BViewController.m

Tetikleyen: B classında bulunan buton

Tetiklenen: A classında bulunan label’in içeriğinin değişmesi

Sonuç 🔨

https://www.youtube.com/watch?v=Y8PxMAZvYyQ

Yukarıdaki gibi bir senaryoda B classından A classına veri de gönderebilirsiniz. Protocol içerisinde tanımladığım metod parametre alsaydı eğer B classında o metod çağırılırken gönderilen veri, A classında islem sırasında kullanilabilirdi.

Bu yazı biraz uzun oldu, frameworklerin delegate metodlarını kullanmayı da bir sonraki yazıda paylasacağım. Benim delegate’i anlamam biraz zaman almıştı, umarım okuyan birilerine yardımcı olabilir niteliktedir.

Okuduğunuz icin teşekkür ederim, geri bildirimlerinizi bekliyorum ❤️👏🏼

--

--