İçeriğe geç

Custom UITableViewDataSource oluşturmak

Merhabalar bu yazımda sizlere özel olarak kendi UITableViewDataSource sınıfınızı nasıl oluşturup, kullanabileceğinizi göstereceğim.

iOS ile uygulama geliştirirken çoğunlukla TableView ve CollectionView kullanırız ve bunların bağlı olduğu Delegate ve DataSource olduğunu biliriz. Yazdığımız projelerde kendimize özgü daha temiz ve kullanımı kolay DataSource sınıfları yazabiliriz. Bu işlem için sınıf üzerinde Generics yapısını kullanarak olayı dinamikleştirmek çok önemli bir nokta.

Aşağıda yazmış olduğum örnek sizlere bu işlemi basit bir şekilde göstermek için yazdım. Daha detaylı bir birine bağlı generics yapıları kullanarak ve olmazsa olmaz protocol yapıları ile kodunuzu şahlandırabilirsiniz.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tblView: UITableView!
    
    var source: CustomTableDataSource<String, UITableViewCell>!
    let data = ["Bam", "Bum", "Bam", ":P"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tblView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.id)
        
        source = CustomTableDataSource(data: self.data, completion: { (data, cell) in
            cell.textLabel?.text = data
        })
        
        self.tblView.dataSource = source
    }
}

extension UITableViewCell {
    static var id:String {
        return String(describing: self)
    }
}

class CustomTableDataSource<T, Cell: UITableViewCell>: NSObject, UITableViewDataSource {
    
    typealias completionType = (T, Cell) -> Void
    
    var completion: completionType!
    var dataModel:[T] = []
    
    override init() {}
    
    init(data: [T], completion: @escaping completionType) {
        self.dataModel = data
        self.completion = completion
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataModel.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: Cell.id) as? Cell else {return UITableViewCell()}
        let row = dataModel[indexPath.row]
        completion(row, cell)
        return cell
    }
}

 

Tarih:iOS

Bu yazı yorumlara kapalı.

Copyright © 2021 Kenan Atmaca