Press ESC to close

Swift Sayfalar Arası Veri Gönderme

Merhaba arkadaşlar, bu yazımızda Swift ile nasıl iki sayfa arasında veri gönderilir bundan bahsedeceğiz. Het uygulamada aslında sayfalar arasında bir iletişim mevcut. Örnek vermek gerekirse ana sayfada listeniz varsa ve bu listenin bir elemanına tıkladığımızda bunun detayını göstermeliyiz.

Örnek

Yapacağımız örnekte bir meyve modelimiz olacak ve detayında kaç kalori olduğundan bahseceğiz. İlk sayfamızda meyve listemizdeki meyvelerin isimlerini gösterelim. Listeye tıklandığında ise detayına gidip, büyük harflerle kaç kalori olduğunu yazalım. Tasarım ekranımız bu şekilde gözükmekte.

 

Model

Bir tane meyve modeli oluşturmamız lazım. Bunun için meyve adı ve kaç kalori olduğunu tutan bir model oluşturmamız yeterli olacaktır.

struct FruitModel {
    let name: String
    let calorie: Int
}

Controller

Şimdi ise listeleme işlemi için Controller’imizda örnek meyveler ve kalorilerini tuttuğumuz bir dizi tutuyoruz. Sonrasında ise UITableView’imize bağlıyoruz. Seçilen meyve için bir değişken tutmamız lazım. Bu değişkeni, kullanıcı her meyve seçtiğinde seçtiği meyve ile değiştirmemiz gerekiyor. Değiştirdikten sonra liste sayfamızdan detay sayfamıza gitmeyi sağlayan Segue’yi çalıştırmamız lazım. Bu Segue’ye “showDetail” Identifier’ini vermiştik. Segue’yi çalıştırdıktan sonra prepareSegue fonksiyonu ile detay sayfasındaki meyve değişkenine, seçtiğimiz değişkeni atıyoruz.

//
//  ViewController.swift
//  SwiftDataTransfer
//
//  Created by Omer Sezer on 7.03.2021.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tvFruits: UITableView!
    
    var selectedFruit: FruitModel?
    
    let models: [FruitModel] = [
        FruitModel(name: "Apple", calorie: 95),
        FruitModel(name: "Avocado", calorie: 320),
        FruitModel(name: "Banana", calorie: 111),
        FruitModel(name: "Cherries", calorie: 4),
        FruitModel(name: "Kiwi", calorie: 112),
        FruitModel(name: "Lime", calorie: 20),
        FruitModel(name: "Mango", calorie: 220),
        FruitModel(name: "Strawberries", calorie: 49),
        FruitModel(name: "Peach", calorie: 59),
        FruitModel(name: "Orange", calorie: 62)
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUI()
    }
    
    func setUI() {
        // MARK: title
        title = "Fruits"
        
        // MARK: tvFruits
        tvFruits.delegate = self
        tvFruits.dataSource = self
    }
    
    func goDetail(fruit: FruitModel) {
        selectedFruit = fruit
        performSegue(withIdentifier: "showDetail", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            let detailVC = segue.destination as! DetailViewController
            detailVC.fruit = selectedFruit
        }
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        goDetail(fruit: models[indexPath.row])
    }
    
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return models.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = models[indexPath.row].name
        return cell
    }
}

Detay sayfasına seçilen meyveyi atadıktan sonra sadece ekranda göstermek kaldı. viewDidLoad içerisinde bunu yapabiliriz.

//
//  DetailViewController.swift
//  SwiftDataTransfer
//
//  Created by Omer Sezer on 7.03.2021.
//

import UIKit

class DetailViewController: UIViewController {

    @IBOutlet weak var lblFruitName: UILabel!
    @IBOutlet weak var lblFruitCalorie: UILabel!
    
    var fruit: FruitModel?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setUI()
    }
    
    func setUI() {
        lblFruitName.text = fruit?.name
        lblFruitCalorie.text = "\(fruit?.calorie ?? 0) cal"
    }

}

Ekran çıktımız aşağıdaki gibidir.

Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz. İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir