29 Aralık 2010
Birden fazla Table View ile çalışmak
Eğer iPhone uygulamamızda birden fazla Table View kullanmak istiyorsanız ve kodlar da birbirine karışmasın diyorsanız aşağıdaki adımları takip ediniz:
- View Based Application taslağı ile yeni bir proje oluşturun. (Bu yazı için hazırladığımız örnek projemize “CokluTablo” adını verdik. Dosya isimlendirmeleri bu şekilde yapılacaktır.)
- Resurce klasöründeki CokluTabloViewController.xib dosyasını Interface Builder ile açıp içine Library’den 2 tane TableView nesnesi yerleştirin. (Resim 1)
- Xcode’a geri dönüp Classess klasörüne sağ tıklayın ve şu adımları seçin: Add -> New File -> UIViewController Subclass (seçeneklerden sadece UITableViewController subclass seçili olsun). (Resim 2)
- Dosya adı olarak Tablo1.m yazın (Tablo1.h da otomatikmen oluşacaktır).
- Aynı işlemi tekrar yapın ve dosya adı olarak Tablo2.m yazın.
- Her iki .m dosyasında da TableView’a ait delegate fonksiyonları hazır olarak bulunmaktadır. Bu fonksiyonların (en mühim üç tanesinin) ne işe yaradıklarını şu yazıda bulabilirsiniz. Bu örneğimizde Tablo1’de Domates, Biber, Patlıcan elamanlarından oluşan dizinin sıralanmasını, Tablo2’de de Elma, Armut, Portakal elemanlarından oluşan dizinin sıralanmasını istiyoruz.
- Sebze dizisi için Tablo1.h dosyasında dizi tanımı ve bu diziyi doldurmak için çalıştıracağımız init fonksiyonunun tanımını yapalım: NSArray *arrSebze; ve -(void) init; (Resim 3)
- Meyve dizisi için Tablo2.h dosyasında dizi tanımı ve bu diziyi doldurmak için çalıştıracağımız init fonksiyonunun tanımını yapalım: NSArray *arrMeyve; ve -(void) init;
- Tablo1.m dosyasında yukarıda tanımını yaptğımız init fonksiyonunu yazıp içinde arrSebze dizisini dolduralım: arrSebze=[[NSArray alloc] initWithObjects:@”Domates”, @”Biber”, @”Patlıcan”,nil]; Sonra da numberOfSectionsInTableView fonksiyonunu aktif hale getirip Tablo1’in kaç grupdan oluşacağı bilgisini döndürelim. (Resim 4)
- Tablo2.m dosyasında da init fonksiyonunu oluşturup içinde Meyve dizisini dolduralım (arrMeyve=[[NSArray alloc] initWithObjects:@”Elma”, @”Armut”, @”Portakal”,nil];) ve numberOfSectionsInTableView fonksiyonunu aktif hale getirip Tablo2’nin kaç grupdan oluşacağı bilgisini döndürelim.
- Tablo1.m ve Tablo2.m dosyasındaki ilgili diğer fonksiyonları (numberOfRowsInSection ve cellForRowAtIndexPath ) bu dizilerdeki dataları gösterecek şekilde düzeltelim. (Resim 5)
- Yukarıda oluşturduğumuz tablo1 ve tablo2 dosyalarını (classlarını) CokluTabloViewController.m dosyamıza import edelim. Bunlar Table View’larımızı kontrol edecek olan Controller’lardır. (Resim 6)
- CokluViewController.h dosyasında UITableView tipinde iki nesne tanımlayalım. Bu nesneler Interface Builder’da hazırladığımız ekrandaki Table View nesnelerine işaret edeceği için tanımlamamızın başına IBOutlet ifadesini koymayı unutmayalım. Dolayısı ile @property ifadelerini ve CokluViewController.m dosyasında @synthesize ifadelerini de yerleştirelim . (Resim 7)
- Interface Builder’da ekrana yerleştirdiğimiz iki Table View nesnesinin Inspector penceresindeki “Referencing Outlets” bilgisini sürükleyerek File’s Owner’a bırakalım. Böylece bir üst maddede yazdığımız tablo1 ve tablo2 builder’daki nesnelerle haberleşebilir. (Resim 8)
- Son olarak hazırladığımız Tablo1 ve Tablo2 classlarıyla oluşturduğumuz TableViewController’ları kod içerisinde hayata geçirip init fonksiyonlarını çalıştıralım. Sonra bunları tablo1 ve tablo2 TableView’larının delegate ve dataSource’u olarak setleyelim. Bu işlemi CokluViewController.m dosyasında yer alan viewDidLoad fonksiyonu içerisinde yapalım. (Resim 9)
- Artık kodumuzu build edip simülatör çıktısını görebiliriz.
Resim 1 | Resim 2 |
Resim 3 | Resim 4 |
Resim 5 | Resim 6 |
Resim 7 | Resim 8 |
Resim 9 | |
Sonuç |
Örnek dosyayı buradan indirebilirsiniz.
Bu yazının dünkü versiyonunda sebze ve meyve dizilerini nerde nasıl oluşturacağımı bilemediğimden TableView’e ait delegate fonksiyonlarından en zararsızının içine yazmıştım. Bugünkü derste öğrendim ki init diye (ya da başka bir şey) bir fonksiyon yazıp diziyi bunun içinde oluşturmalı, bu fonksiyonu ise CokluTabloViewController.m dosyası içinde alloc eder etmez [cntrlTablo1 init]; diyerek çağırmak kafi.