10 Şubat 2015 Salı

IOS Swift ile UIPickerView Kullanımı

Merhaba öncelikle UIPickerView'i ne için kullanacağımdan bahsedeyim. Yapacağım uygulama için kullanıcıların uygulama kategorileri içinden bir tanesini seçmesi gerekiyor. Bunu IOS'da nasıl uygulayabileceğimi araştırdım. Bildiğimiz ComboBox'lar için genelde özelleştirilmiş TableView'ler kullanılıyor. Fakat bu aşamada fazla zamanım olmadığından bu yöntemle uğraşıp yeni Celler oluşturup minik bir tableview yapmak istemedim ve Xcode6'da bulunan elemanlardan UIPickerView dikkatimi çekti. Bu genelde uygulamalarda doğum günümüzü girerken sıklıkla kullandığımız veya alarm kurarken saati ayarladığımız görsele benziyor fakat onun adı UIDatePicker ve UIPickerView'in tarih ve saat için özelleştirilmiş hali zannedersem.

Önce UIPickerView'i main.storyboard'da istediğimiz view'e yerleştiriyoruz. Ve control + click le sürükleyerek view controllerın köşesindeki sarı yere bırakıyoruz. Karşımıza iki seçenek çıkıyor delegate ve dataSource. Burada delegate i seçiyoruz ve view ile UIPickerView'i bağlamış oluyoruz.

Screen Shot 2015-02-10 at 8.12.54 PM

Şimdi bu ViewController'ın Swift dosyasına UIPickerView classını eklememiz gerekiyor bunu aşağıdaki şekilde ekliyoruz.

 

class ViewController: UIViewController , UIPickerViewDelegate{...


 

Şimdi bu picker'ın içini doldurmak için bir array oluşturacağız.


 

var kategoriler = ["pop","rock","..."]


 

ViewControllerimizi UIPickerViewDelegate Classından yukardaki şekilde inherit ettikten sonra  bu classın bazı metodlarını aşağıdaki gibi tanımlayabiliriz.
Bir classın sahip olduğu metodları görmek için xCode6 da cmd tuşuna basılı tutarak classın isminin üzerine gelin. Rengi maviye dönecek ve altı çizili hale gelecektir ve tıkladığınızda bu classın tanımlandığı sayfaya gideceksiniz istediğiniz metodu buradan kopyalayıp kullanabiliriz.



//component sayısı şimdilik 1 kullanıyoruz.
func numberOfComponentsInPickerView(pickerView: UIPickerView) Int{
return 1
}


//pickerdaki kayıt sayısı dizimizin boyutu ile aynı olacak
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) Int{
return kategoriler.count
}

//burada her satır için dizinin o satırdaki değerini döndürmemiz gerekiyor
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) String! {
return kategoriler[row]
}

 


// pickerda herhangi bir kayıt seçildiğinde çalıştırılacak metod (seçilen kaydın indexi row değeri)


func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){

var itemSelected = kategoriler[row]


        label.text = itemSelected


}



 

Son fonksiyon ile seçilmiş olan kaydın indeksine ulaşmış oluyoruz bu index ile de dizideki elemanı alıp istediğimiz şekilde kullanabiliriz.


UIPickerView'i birden çok component ile kullanma


Buradaki componentler aslında sütunlara karşılık geliyor. Bunun için yukarıda kullandığımız metodların aynılarını kullanacağız fakat ilk metodda 1 yerine kaç sütun istiyorsak o sayıyı döndüreceğiz. Diğer metodlarda ise metodun hangi componentten çağırıldığını kontrol edip buna göre işlemimizi gerçekleştireceğiz. Aynı şekilde pickerviewi main storyboarda ekleyip Classını View Controller'ımıza ekledikten sonra UIPickerViewDelegate classının metodlarını tanımlıyoruz.


 

//component sayısı bu defa 2 olsun. Yani 2 sütunlu bir pickerımız olacak


func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{


    return 2


}


//ilk sütun için kategoriler dizisi ikinci sütun için altkategoriler dizisinin boyutları döndürülüyor.


func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{


    if(component == 0){


        return kategoriler.count


    }else{


        return altkategoriler.count


    }


}


//aynı şekilde ilk sütun için kategoriler ikincisi için altkategoriler dizisinin elemanlarını döndürüyoruz


    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!{


 if(component == 0){


    return kategoriler[row]


}else{


    return altkategoriler[row]


}


}


 

//burada bir değişiklik yaptım ve ikinci sütunu birinci sütunda seçilen değere göre tekrar yükledim.

// altKategoriler = [["pop","rock"],["a","b"],["x","y"]] şeklinde bir dizim var. bu iki boyutlu bir dizi ve her indexi bir kategorinin alt kategorilerini tutuyor.

//row değeri seçilen kategori değerini belirtiyor ve altKategoriler dizisinin seçilen kategorideki indexinde bulunan altkategoriler dizisi pickerın altkategoriler dizisine eşitleniyor ve bu yeni değerler için picker yeniden yükleniyor.

//buradaki pickerControl değeri mainstoryboarddan control + click pickerı sürükleyerek view controllera bırakarak oluşturuldu.

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){


 if(component == 0){


    itemSelected = kategoriler[row]

    altkategoriler = altKategoriler[row]


    pickerControl.reloadAllComponents()


    self.fileUrlLabel.text = itemSelected


}else{


    var itemSelected = altkategoriler[row]


    self.fileUrlLabel.text = itemSelected 


}}


 

UIPickerView'in son hali böyle oldu. Güle güle kullanın :)

Screen Shot 2015-02-11 at 1.02.15 AM

Hiç yorum yok:

Yorum Gönder