Bu yazımda iPhone uygulamalarında en sık kullanılan navigasyon tipi olan UINavigationController ile derinlikli navigasyonun nasıl yapıldığını anlatacağım. Bu tür navigasyon genellikle çok sayıda ekrana sahip olan uygulamalarda kullanılmakta. Birbirinden bağımsız modüllerden oluşan veher bir modülünde çok sayıda ekran olan uygulamalarda ise hem Tab Barhem de Navigation Bar içeren bir yapı görmek de mümkün ancak bu pekyaygın bir kullanım değil. Burada tek başına Navigation Bar kullanarak 2ekranlı bir uygulama nasıl yapılır onu anlatacağım. Bu yazıyı okumadan önce Tab Bar Controller'dan bahseden önceki yazımı okumanızı tavsiye ederim çünkü oradakine benzer işlemler yapacağımız için burada her şeyi çok detaylı anlatmayacağım.
Öncelikle "Navigation-based Application" taslağını kullanarak "Ornek" adında yeni bir proje yaratın. Bu taslağı kullanıyor olmamızın sebebi aynı Tab Bar örneğinde olduğu gibi XCode'un bazı şeyleri bizim yerimize otomatik yapıyor olması. Proje yaratıldığında aşağıdaki şekilde olacaktır.
Önce uygulamayı bu haliyle çalıştırıp bir bakın, sonra da Tab Bar örneğinde yaptığınız gibi taslağın yaratmış olduğu ViewController ile ilgili dosyaları silin çünkü yerine yenilerini yaratacağız.
Şimdi projeye Level1VC ve Level2VC adında 2 tane yeni ViewController ekleyin. Bunlardan ilki uygulama açıldığında karşınıza gelecek, ikincisi ise ilk ekrandaki bir tuşa basıldığında. Level2VC'den ilk ekrana geri tuşuna basarak dönebileceksiniz. Bu işlevselliği yapmadan önce eklemiş olduğunuz ViewController'ların .xib dosyalarını açıp arkaplan renklerini değiştirin ve her birine hangi sayfa olduğunu gösterecek olan bir Label koyun. Ayrıca her iki .xib dosyasındaki View için Attribute Inspector bölmesindeki Simulated Metrics kısmından Top Bar özelliğini "Navigation Bar" olarak ayarlayın. Bunu yapınca XCode aynı Tab Bar örneğinde olduğu gibi size referans olması amacıyla ekrana bir bar koyacak. Ancak bu sefer aşağıya bir Tab Bar değil, yukarıya bir Navigation Bar koyacak. Son olarak ilk ekrana bir tane tuş koyup tuşun başlığını "2. Ekrana Git" olacak şekilde değiştirin. Level1VC.xib dosyasındaki arayüzün son hali şunun gibi bir şey olmalı.
Şimdi sıra geldi Navigation Controller ile bu ekranlar arasındaki bağlantıyı yapmaya. Bunu da Tab Bar örneğindeki ile benzer şekilde yapacaksınız. MainWindow.xib dosyasını açıp içerisindeki Navigation Controller nesnesinin Root View Controller ile gösterilen ana ViewController'ının class ve Nib Name özelliklerinin her ikisini de Level1VC yapın. Buna ek olarak obje listesinden, Root View Controller altındaki Navigation Item'ı seçin ve Attribute Inspector aracılığı ile title özelliğini "İlk Seviye Başlığı" yapın. Bunu yapar yapmaz Level1VC'nin yönettiği ekranın başlığının değiştiğini göreceksiniz. Bundan sonraki adım ilk ekrandaki tuşa basınca ikinci ekranın gelmesini sağlamak. Bunun için bir action metod'u tanımlayıp içerisine bir kaç satırlık objective-c kodu yazmanız gerekiyor. Aşağıda Level1VC.m dosyasına tam olarak ne yazmanız gerektiğini görebilirsiniz. Header dosyasına action metod'unun tanımlaması yapmayı da unutmayın.
#import "Level1VC.h"
#import "Level2VC.h"
@implementation Level1VC
-(IBAction)tusaBasildi
{
Level2VC* vc = [[Level2VC alloc] initWithNibName:@"Level2VC" bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
[vc release];
}
@end
Burada ikinci sayfayı ekrana getirebilmek için öncelikle ikinci sayfayı kontrol eden ViewController olan Level2VC sınıfından bir nesne yarattık. Sonra da yarattığımız bu nesneyi .xib dosyasındaki UINavigationController türündeki objemize işaret eden navigationController Outlet'i (Bu Outlet bizim için taslak tarafından zaten yaratılmıştı) aracılığıyla Navigation Controller'a ekledik. Eklerken pushViewController:animated: adlı metodu kullandık. Animated parametresine YES derseniz ikinci ekran sağdan kayma animasyonu ile birlikte gelecek, NO derseniz de animasyonsuz şekilde aniden gelecektir. Metodun adının push ile başlamasının sebebi, UINavigationController sınıfının ViewController'ları bir yığın yapısı içerisinde tutuyor olması. Eklediğiniz her ViewController yığının en tepesine konuyor. Yeni bir ekran açmak istediğinizde onu yöneten ViewController'ı yığına ekliyor, ekranı kapatıp önceki ekrana dönmek istediğinizde de popViewController:animated metodu ile yığının tepesinden çıkarıyorsunuz.
Şimdi yazmış olduğunuz action metodunu tuşun Touch Up Inside event'ine bağlayın. Uygulamayı çalıştırmadan önce Level2VC.m dosyasını açarak viewDidLoad: metodu içerisinde 2. sayfanın başlığını aşağıdaki şekilde "2. Seviye" olarak ayarlayın. Bunu koddan yapmak zorundasınız çünkü bu ekrana ait NavigationItem .xib dosyasında yok, dinamik olarak biz yaratıyoruz.
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"2. Seviye";
}
Uygulamayı bu haliyle çalıştırın. Tuşa bastığınızda ikinci ekranın animasyonlu bir şekilde geldiğini göreceksiniz. Göreceğiniz bir diğer şey ise Navigation Controller'ın Navigation Bar içerisine otomatik olarak önceki ekrana dönmenizi sağlayacak bir tuş da koymuş olması. Tuşun üzerindeki yazının daha önce MainWindow.xib içerisindeki NavigationItem'a verdiğiniz başlıktan geldiğine dikkat edin.
Burada olduğu gibi geri tuşunda bu kadar uzun bir yazının kötü göründüğü durumlarda yine kod içerisinden bu tuşun üzerindeki yazıyı değiştirmek mümkün. Bunu yapmak için bu ekranın parent'i olan ekranda, yani bu ekranı "push" eden ViewController içerisine (bu durumda Level1VC içerisine) 3 satırlık objective-c kodu eklemeniz gerekiyor. Kodu demin yazdığınız action metoduna aşağıdaki şekilde ekleyin.
-(IBAction)tusaBasildi
{
UIBarButtonItem* geriTusu = [[UIBarButtonItem alloc] initWithTitle:@"Geri" style:UIBarButtonItemStyleBordered target:nil action:nil];
[self.navigationItem setBackBarButtonItem:geriTusu];
[geriTusu release];
Level2VC* vc = [[Level2VC alloc] initWithNibName:@"Level2VC" bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
[vc release];
}
Burada yeni bir Tab Bar Item yaratıp bunu bu ekranı temsil eden NavigationItem'a geri tuşu olarak ayarladık. Bu işlemden sonra uygulamayı tekrar çalıştırırsanız artık geri tuşunun üzerinde önceki ekranın başlığı yerine "Geri" yazdığını görürsünüz.
Yazımı bitirmeden önce bir dip not olarak, NavigationController kullandığınız zaman yukarıda bir navigasyon barı göstermek zorunda olmadığınızı da söyleyeyeim. Varsayılan olarak konuyor ancak NavigationController'ın özelliklerinden bunu kapatabilrsiniz. Tabi bu durumda geri tuşunu sizin yapmanız gerekmekte. Bunu yapmak aşağıdaki metodu çağırmaktan ibaret.
[self.navigationController popViewControllerAnimated:YES];
Bu mesajı hangi ViewController içerisinden gönderirseniz, o ViewController ve yönettiği ekran Navigation Controller'ın yığınından silinecek ve bir önceki ekrana geri dönülecektir.