ios dersleri

iOS View Controller Kullanımı ve View Controller Yaşam Döngüsü

Merhaba Arkadaşlar,
mobilhanem.com da iOS Uygulama Geliştirme eğitim serimize kaldığımız yerden View Controller dersi ile devam ediyoruz. Bir önceki derste Stack View ile Kullanıcı Arayüzü Tasarlama konusunu işledik. View controller’lar yazacağımız iOS uygulamalarının en temel bileşenini oluşturur. Uygulamanızı kullanan kişiler ekrana dokunduğunda yapılacaklardan, gösterilecek animasyonlara, birden fazla ekranlı uygulamarda sayfalar arası geçiş gibi bir çok konuyu view controller aracılığıyla yapabiliriz. Dilerseniz öncelikle view controller’ın tanımıyla başlayalım.

View Controller Nedir?

View Controller yaptığımız iOS uygulamalarının temel bileşenidir. Her uygulamada en az bir tane bulunur ancak bir çok uygulama birden fazla view controller’a sahiptir. View controller kullanıcı arayüzünü (UI) yönetir; bu arayüzler arasındaki geçişleri ve altındaki model adı verilen data’nın birbirleri arasındaki geçişini sağlar. Dilerseniz daha önceki yazılarda anlatıldığı gibi yeni bir Xcode projesi oluşturalım.

Xcode kullanarak View oluşturmanın birden fazla yolu var. Bunları sırasıyla inceleyelim.

Storyboard ile Oluşturma

Storyboard kullanarak view’ınızı oluşturabilirsiniz. Proje oluşturduğunuzda Main.storyboard’a tıklayarak açılan sayfada resimdeki gibi tepede duran (+) tıklayarak gelen arama çubuğuna View Controller yazarak view’ı oluşturabilirsiniz.

XIB Kullanarak Oluşturmak

Uygulamamız için view controller oluşturmanın bir diğer yolu da XIB kullanmaktır. XIB XML tabanlı kullanıcı arayüzü dosyasıdır. Kullanıcı arayüzüyle ve içindeki view’larla ilgili özellikleri barındırır. Tıpkı storyboard’da oluşturduğumuz gibi XIB’de bir view controller class’ına bağlanır. Şimdi gelelim XIB oluşturmaya, Projeniz açıkken Command + N kısayoluyla yeni dosya oluşturma sayfasını açalım. Açılan sayfadan Cocoa Touch Class seçip açılan sayfada Also Create XIB file seçin ve Next’e tıklayın. Bunun sonucunda bir adet ViewController class’ı ve XIB uzantılı view dosyası oluşacaktır.

Storyboard ile XIB arasındaki fark ise storyboard birden fazla view controller içerirken XIB’de yalnızca bir tane bulunur.

Aşağıdaki View Controller kodunu birlikte inceleyelim.

class ViewController: UIViewController { // 1

    @IBOutlet weak var helloLbl: UILabel! // 2

    override func viewDidLoad() { // 3
        super.viewDidLoad()
        helloLbl.text = "Aşağıdaki butona tıklayın" // 4
    }

    @IBAction func onClickPressed(sender: UIButton) { // 5
        helloLbl.text = "Merhaba Dünya!"
    }
}
  1. ViewController isminde UIViewController’dan türeyen bir class oluşturduk.
  2. Bu class’a ait “Merhaba Dünya” yazacağımız bir outlet oluşturduk. @IBOutlet storyboard ile view controller arasındaki bağlantıyı sağlar. IBOutlet ve IBAction oluşturma
  3. UIViewController class’ının metodu olan viewDidLoad() view controller yaşam döngüsünün en önemli parçalarındandır. Kullanıcı arayüzümüzle ilgili yapmak istediğimiz ilk değişiklikleri burada yapabiliriz.
  4. Burada label’a ilk değerini veriyoruz.
  5. onClickPressed(sender:) ise @IBAction keyword’ü ile tanımlanan view controller aksiyonu. Butona tıklandığında ne olacağıyla ilgili kodlarımızı burada yazabiliriz.

Her view controller class’ı UIView tipinde bir view içerir. Yukarıdaki örnekte butonu, labelı view controller’a ait (direk kendisi oluşur) view’ın birer alt parçası olarak tanımlayabiliriz. @IBOutlet ve @IBAction aracılığıyla bunlarla etkileşim kurarak uygulamayı istediğimiz şekilde manipüle edebiliriz.

Biraz önce verdiğimiz örnekte view controller yaşam döngüsü diye bir ifade kullandım peki nedir bu yaşam döngüsü ve hangi aşamalardan geçer gelin hep beraber inceleyelim.

View Controller Yaşam Döngüsü

iOS uygulama geliştirirken view controller yaşam döngüsünün anlaşılması ve doğru kullanımı çok önemlidir. Yaşam döngüsü isminden de anlaşılacağı üzere view controller’ın yaşamı boyunca ne yapacağını tanımlar. View controller’ın yüklenmesi, view hiyerarşisine eklenmesi veya silinmesi gibi bir çok işlem yaşam döngüsünde tamamlanır. View controller’ın yaşamı her class gibi initialize edildiğinde başlar. Ardından view controller’a ait view storyboard aracılığıyla oluşturulur. Bunlar tamamlandığında ise viewDidLoad metodu çağırılır.

  • loadView() Eğer view’ı storyboard kullanarak oluşturduysanız bu metodu kullanmanıza gerek yok. Ancak view’ı kod yazarak oluşturduysanız viewDidLoad() yerine bu metodu kullanabilirsiniz.
  • viewDidLoad() view controller’ın view’ı oluşturulup storyboard’dan yüklendiğinde çalışır.  Bu noktada oluşturduğumuz outlet’lerin yaratıldığı garantidir. View controller ile ilgili özelleştirmeleri (IBOutlet ) genellikle burada yapılır. Yalnız burada dikkat etmeniz gereken nokta viewDidLoad() metodunun yalnızca bir kez çağrılıyor olmasıdır.
  • viewWillAppear() Bu metod view controller’a ait view’ın uygulamanın view hiyerarşisine eklenmeden hemen önce çağrılır. Ancak, bu metodu çok maliyetli olmayan ve view controller gösterilmeden hemen önce yapmamız gereken işlemlere ayırırız. ViewDidLoad()’dan farkı hemen ondan önce çağrılması ve view controller her gözüktüğünde çağrılıyor olmasıdır.
  • viewDidAppear() ise view controller’a ait view’ın uygulamanın view hiyerarşine eklenmesinin hemen ardından çağrılır. Varsa animasyonunuzu çağırmak veya verileri çekmeniz için uygun bir metoddur. Yine viewWillAppear() gibi ekran her gösterildiğinde çağrılır.
  • viewWillDisappear() ise view controller’a ait view’ın uygulamanın view hiyerarşisinden silinmesinden hemen önce çağrılır. Yani view controller kaybolmadan hemen önce çağrılır. View controller’da klavyenin gizlenmesi veya herhangi bir verinin kaydedilmesi için kullanılabilir.
  • viewDidDisappear() ise view controller’a ait view’ın uygulamanın view hiyerarşisinden silinmesinden hemen sonra çağrılır.

viewDidLoad() view’ın yüklenmesi bittiğinde, loadView() ise view yüklenmeye başladığı anda çağrılır.

Tanımlamalarımızı tamamladık peki gerçek hayatta bunları nerelerde kullanmalıyız diye merak ediyor olabilirsiniz. Aşağıdaki örneklerle kullanım senaryolarını biraz daha örneklendirmeye çalışacağım.

  • viewDidLoad() özelleştirmeler için en uygun yerdir. Örneğin label’ımızın text’ini değiştirme işlemini burada yapabiliriz.
  • viewWillAppear() önceden hazırlamamız gereken veriler için kullanabiliriz. Bir API’dan çektiğimiz verilerle kullanıcı arayüzünü güncellemek için burayı kullanabiliriz.
  • viewDidAppear() uygulamamızın Login ekranının olduğunu varsayalım kullanıcının öncesinde Login olup olmadığını olmamışsa Login ekranının gösterilmesi gibi işlemler için burayı kullanabiliriz.
  • viewWillDisappear() örneğin veritabanı kullanıyoruz ve view controller üzerinden bu veritabanında değişiklikler yaptık yaptığımız bu değişiklikleri kaydetmek için burayı kullanabiliriz.
  • viewDidDisappear() örneğin view controller kaybolduğunda bir view’ı göstermek veya gizlemek istiyorsak burayı kullanabiliriz.

Aşağıdaki View controller içerisindeki kodu inceleyelim.

    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad çalıştı")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear çalıştı")
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear çalıştı")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("viewWillDisappear çalıştı")
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("viewDidDisappear çalıştı")
    }

Yukarıdaki kodu çalıştırdığımız takdirde sırasıyla;

  1. viewDidLoad çalıştı
  2. viewWillAppear çalıştı
  3. viewDidAppear çalıştı

Yine başka bir view controller’a geçtiğimiz takdirde;

  1. viewWillDisappear çalıştı
  2. viewDidDisappear çalıştı

çıktılarını göreceksiniz.

ÖZET

Bu yazımızda iOS uygulama geliştirmenin en temel konularından birisi olan ViewController’ın tanımını, nasıl oluşturulduğunu ve ViewController yaşam döngüsü konularına değindik. Storyboard mu yoksa XIB mi sorusunun kesin bir cevabını vermek mümkün değil, tamamıyla sizin tercihinize kalmış. Ancak Storyboard kullandığınız durumlarda dikkatli olmanız gereken husus mümkün olduğunca ViewController’ları alt modüllere ayırmanız; yani birbiriyle alakalı controller’ları aynı storyboard içerisinde tanımlamalısınız. Aksi takdirde uygulamanız büyüdükçe projenizin kontrolünü ve bakımını zor hale getirecektir. Yazıyla alakalı değerli görüşlerinizi, soru veya yorumlarınızı yorumlar kısmına ya da buradan soru cevap kısmına yazabilirsiniz. Diğer derste görüşmek dileğiyle.

Tüm iOS Dersleri için tıklayınız.

 

128

Atalay Aşa

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?