Ana Sayfa Blog Sayfa 2

Swift İle Json Veri Çekme ve Parse İşlemi

0

Json ile veri çekme işlemi her uygulamamızda ihtiyaç duyabileceğimiz bir konu. Json ile ilgili notumu da buraya bırakıyorum. Veri çekeceğimiz site SSL kullanmıyorsa, https yerine http protokolü ile bağlanmak zorundaysak, info.plist dosyasında bazı konfigrasyonlar yapmamız gerekmektedir.

HTTP Ayarı

info.plist içerisinde App Transport Security Settings altında yeni bir item ekleyerek Allow Arbitarary Loads : YES değerini girmeliyiz.

Json Getirme ve Parse Etme

let url = URL(string: “http://data.fixer.io/api/latest?access_key=55196be8be63f0c8ea98df28177c5cdf")
let session = URLSession.shared
let task = session.dataTask(with: url!) { (data, response, error) in

if error != nil {

print("URL'den Veri Çekilemedi!”)

}else{

if data != nil {
do {

let jsonArray = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String, Any> 
  DispatchQueue.main.async {
    if let rates = jsonArray["graphql"] as? [String : Any]{
     if let rates = rates["user"] as? [String : Any]{
       print(rates["TRY"]!) 
     }
    }
  }

} catch {

}
}
}
}

task.resume()

Swift Notification Center ile Veri Aktarma

0

Notification Center ile tüm viewController’lar içerisinden dinlenebilecek bir sinyal gönderebilirsiniz.

Sender

NotificationCenter.default.post{ name: NSNotification.Name(“newdata”) , object: nil }

Listener

NotificationCenter.default.addObserver(self, selector: #selector(getData), name: NSNotification.Name(rawValue: "newdata"), object: nil)

CoreData ile Veri İşlemleri

2

CORE DATA (SAVE)

Attributes alanında sql tarzında sütunlar oluşturulmaktadır. 

Önemli : CoreData import edilmelidir.

Veri Kaydetme

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let newPainting = NSEntityDescription.insertNewObject(forEntityName: "Paintings", into: context)

newPainting.setValue(UUID(), forKey: "id") 
newPainting.setValue(nameInput.text!, forKey: "name") 
newPainting.setValue(artistInput.text!, forKey: "artist")

if let year = Int(yearInput.text!) {
  newPainting.setValue(year, forKey: "year")
} 

let imageData = imageView.image?.jpegData(compressionQuality: 0.5)    

newPainting.setValue(imageData, forKey: "image")

  do {
   try context.save()
    print("save")
   } catch {
    print("error")
  }

CORE DATA (FETCH)

Veri Çekme

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Paintings") 
fetchRequest.returnsObjectsAsFaults = false
do{
let results = try context.fetch(fetchRequest)
if results > 0 {
 for result in results as! [NSManagedObject] {

  if let name = result.value(forKey: "name") as? String {
   self.nameArray.append(name)
  }

  if let id = result.value(forKey: "id") as? UUID {
   self.idArray.append(id)
  }

 }
}    

 self.tableView.reloadData() 

} catch {
 print(“error")
}

Filtreleyerek Veri Çekme

fetchRequest.predicate = NSPredicate(format: "id = %@", idString! )            

Veriyi Silme İşlemi

For in döngüsü içerisinde

// for result in results { …
context.delete(result) 
// ...
// }

Swift’de Galeriden Fotoğraf Seçme

0

UIImagePickerControllerDelegate, UINavigationControllerDelegate sınıfa dahil edilir. Sonrasında picker tanımlaması yapılır ve present edilir. Kullanıcı galeriden bir görseli seçtiğinde didFinishPickingMediaWithInfo fonksiyonu çağrılacaktır. Bu fonksiyon içerisinde imaj ile ilgili işlemler yapılır ve picker dissmiss edilir.

Picker Tanımlaması

let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
picker.allowsEditing = true // Kullanıcının kırpmasına izin verilsin mi ?
present(picker, animated: true, completion: nil)

Pick Yakalama ve Picker Kapatma

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
imageView.image = info[.editedImage] as? UIImage
self.dismiss(animated: true, completion: nil)
}

Swift’de ImageView Tıklama İşlemi

0

Swift’de bazı objeler tıklanabilir değildir, hatta bazı objeler için bütün kullanıcı etkinlikleri default olarak görmezden gelinir. ImageView’da bunlardan biridir. ImageView’da kullanıcı etkinliklerini dokunma, aşağı çekme gibi durumları yakalayabilmek için isUserInteractionEnabled true olarak gönderilmelidir.

Aşağıdaki kod yardımı ile Image Tap yakalanabilmektedir.

imageView.isUserInteractionEnabled = true
let imageTap = UITapGestureRecognizer(target: self, action: #selector(imageTapFunc))   
imageView.addGestureRecognizer(imageTap)

Bunun için de selector’da belirtildiği gibi imageTapFunc isminde @objc bir fonksiyon oluşturmalıyız.

Swift’de Klavyeyi Kapatma Yöntemleri

0

1 adet gesture oluşturuyoruz, ve view’a ekliyoruz. View’a tıklandığında, hidekeyboard fonksiyonumuz çalışacak şekilde. gestureRecognizer değişkenine atadığımız tıklama event’ı istediğiniz outlet’e tanımlanabilir. Böylelikle dilediğiniz dokunma işleminde klavyeyi gizleyebilirsiniz. (Image gibi objeler için tıklama olayında user interaction aktif edilmesi gerekebilmektedir.)

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
view.addGestureRecognizer(gestureRecognizer) // istenen bileşene eklenebilir.

Fonksiyonumuz

@objc func hideKeyboard(){
view.endEditing(true)
}

Swift İle Listeleme İşlemleri (TableView)

0

Sınıfa dahil edilmesi gerekenler; UITableViewDelegate, UITableViewDataSource dışında 2 ana fonksiyon çağrılmalıdır. cellForRowAt ve numberOfRowsInSection fonksiyonları, tableView için zorunlu eklenmesi gereken fonksiyonlardır.

cellForRowAt fonksiyonu her bir satırı oluşturan fonksiyondur. numberOfRowsInSection’da return edilen sayı kadar çalıştırılır.

cellForRowAt Fonksiyonu

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITabbleViewCell()
cell.textLabel?.text = myFriends[indexPath.row]
return cell
}

numberOfRowsInSection Fonksiyonu 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {   
       return myFriends.count;
}

Delegate

viewDidLoad() içerisinde tanımlanabilir.

tableView.delegate = self
tableView.dataSource = self

Sola Çekerek Silme İşlemi

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
myFriends.remove(at: indexPath.row) // array'den de siliyoruz.
tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.fade) // satırı siliyoruz.
}
}

didSelectRowAt ile Seçim İşlemi

Aşağıdaki kod yardımı ile tablodaki bir elemana dokunulduğunda farklı bir viewController’a segue işlemi gerçekleştirilir.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tiklananIcerik = indexPath.row
performSegue(withIdentifier: "detayEkrani", sender: nil)
}

TableView’da Özelleştirilmiş Satırlar

PrototypeCells Attributes Inspector’dan eklenir ve cell dizaynı yapılır.  Dizayn bittikten sonra yeni bir UITableViewCell class’ı ile yeni bir dosya oluşturup cell class’ı olarak kaydediyoruz. TableView’a resim ekleme, swift ile listeleme işlemleri gibi soruların cevabı prototypeCells’den geçiyor.

let cell = tableView.dequeueReusableCell(withIdentifier: "messageRow", for: indexPath) as! MessageRowTableViewCell
cell.message.text = "deneme mesajı”
cell.likeIcon.image = UIImage(named: “heart")
return cell

Swift’de Timer() Kullanımı

0

Bir işlemi veya bir fonksiyonu belirli aralıklarla çalıştırmak isteyebilirsiniz. Bunu yaparken döngüleri kullanmak uygulamanıza çok ağır bir yük yükler. Bu yüzden sıralı olarak bir fonksiyon veya bir işlem çalıştırılacaksa Timer() kullanmanız gerekmektedir.

Timer.scheduledTimer ile tanımlayıp bir değişkene atıyoruz.

Parametreler

  • timeInterval: Zaman aralığı (sn.)
  • selector: Çalıştırılacak fonksiyon.
  • repeats: İşlem tekrar edecek mi ?
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerFunction), userInfo: nil, repeats: true)

timerFunction() fonksiyonu her 1 saniyede bir kez çalıştırılır.

Swift’de Alert Oluşturma

0

Tanımladığınız alerti present yardımı ile çağırabilirsiniz. Alert’ler fonksiyon içine gömülerek daha kolay ve kolay kullanımı sağlanabilir. Sadece başlık ve mesaj göndererek alert gösterebilirsiniz. Şimdi alert isminde bir UIAlertController tanımayarak 1 adet Tamam butonu ekleyelim ve gösterelim.

Alert bir değişkene atanır ve addaction ile butonlar eklenir. Dilerseniz bu butonlarla fonksiyon çağırabilirsiniz. Sonrasında present edilerek alert ekrana getirilir.

let alert = UIAlertController(
   title: "Oldu Bu!", 
   message: gelenVeri, 
   preferredStyle: UIAlertController.Style.alert
)

alert.addAction(
   UIAlertAction(
      title: "Tamam", 
      style: UIAlertAction.Style.default, 
      handler: nil
   )
)                  

self.present(alert, animated: true)

Swift Kurucu View Metodları (Instance Methods)

0

Swift ile uygulama yazarken, kullanıcı bir ekrandan diğerine geçtiğinde, veya uygulama ilk açıldığında 1 kez, veya uygulamanın ana ekranı 2.kez açıldığında gibi durumlarda bazı işlemler yapmak isteyebilir, bazı fonksiyonları çağırmak isteyebilirsiniz. Bu gibi durumlarda aşağıdaki kurucu metodları kullanabilirsiniz.

viewDidLoad() : View tamamen yüklendiğinde. Herşeyden önce.

viewDidDisappear() : View ortadan kaybolduğunda. Kullanıcı başka sayfaya geçiyor.

viewWillDisappear() : Kullanıcı başka sayfaya geçecek.

viewWillAppear() : View belirmeden önce. viewDidLoad’dan önce. Kullanıcı görmek üzere.

viewDidAppear() : View belirdikten sonra. Kullanıcı gördü.

Önemli Not : Segueler arası geçiş yaparken, viewDidLoad 2.gösterimde çalıştırılmaz viewWillAppear() veya viewDidAppear() kullanılabilir.