UITableview dengan lebih dari Satu Sel Kustom dengan Swift

111

Saya ingin menggunakan UITableview dengan tableViewCells kustom yang berbeda. 3 sel saya adalah sebagai berikut:

  • Sel1: harus memiliki gambar dan label.
  • Sel2: harus memiliki dua label.
  • Sel3: harus memiliki dayPicker.

Saya tidak ingin memberi kode tag untuk sel. Bagaimana saya bisa mengatur ini di Swift. Apakah saya harus membuat kode kelas saya sendiri untuk setiap sel? Bisakah saya menggunakan satu tableviewController? Bagaimana cara mengisi data di sel yang berbeda?

Saya ingin membuat tableView, seperti aplikasi kontak perangkat iOS.

Easyglider
sumber

Jawaban:

270

Mari saya mulai dengan menjawab pertanyaan Anda terlebih dahulu.

Apakah saya harus membuat kode kelas sendiri untuk setiap sel? => Ya, saya yakin begitu. Setidaknya, saya akan melakukan itu.

Bisakah saya menggunakan satu tableviewController? => Ya, Anda bisa. Namun, Anda juga dapat memiliki tampilan tabel di dalam Pengontrol Tampilan.

Bagaimana cara mengisi data di sel yang berbeda? => Bergantung pada kondisinya, Anda dapat mengisi data di sel yang berbeda. Misalnya, anggaplah Anda ingin dua baris pertama menjadi seperti tipe sel pertama. Jadi, Anda cukup membuat / menggunakan kembali jenis sel pertama dan mengatur datanya. Akan lebih jelas, saat saya menunjukkan tangkapan layar, saya kira.

Izinkan saya memberi Anda contoh dengan TableView di dalam ViewController. Setelah Anda memahami konsep utamanya, maka Anda dapat mencoba dan memodifikasi sesuka Anda.

Langkah 1: Buat 3 TableViewCells Kustom. Saya menamakannya, FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Anda harus menggunakan nama yang lebih bermakna.

masukkan deskripsi gambar di sini

Langkah 2: Buka Main.storyboard dan seret dan lepas TableView di dalam Pengontrol Tampilan Anda. Sekarang, pilih tampilan tabel dan pergi ke inspektur identitas. Setel "Prototype Cells" ke 3. Di sini, Anda baru saja memberi tahu TableView bahwa Anda mungkin memiliki 3 jenis sel yang berbeda.

masukkan deskripsi gambar di sini

Langkah 3: Sekarang, pilih sel pertama di TableView Anda dan di inspektur identitas, letakkan "FirstCustomTableViewCell" di bidang kelas Kustom dan kemudian setel pengenal sebagai "firstCustomCell" di inspektur atribut.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Lakukan hal yang sama untuk semua yang lain- Setel Kelas Kustomnya masing-masing sebagai "SecondCustomTableViewCell" dan "ThirdCustomTableViewCell". Juga setel pengenal sebagai secondCustomCell dan thirdCustomCell secara berurutan.

Langkah 4: Edit Kelas Sel Kustom dan tambahkan outlet sesuai kebutuhan Anda. Saya mengeditnya berdasarkan pertanyaan Anda.

PS: Anda harus meletakkan outlet di bawah definisi kelas.

Jadi, Di FirstCustomTableViewCell.swift, di bawah

class FirstCustomTableViewCell: UITableViewCell {

Anda akan menempatkan outlet tampilan label dan gambar Anda.

 @IBOutlet weak var myImageView: UIImageView!
 @IBOutlet weak var myLabel: UILabel!

dan di SecondCustomTableViewCell.swift, tambahkan dua label seperti-

import UIKit

class SecondCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var myLabel_1: UILabel!
    @IBOutlet weak var myLabel_2: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

dan ThirdCustomTableViewCell.swift akan terlihat seperti-

import UIKit

class ThirdCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dayPicker: UIDatePicker!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Langkah 5: Di ViewController Anda, buat Outlet untuk TableView Anda dan atur koneksi dari storyboard. Selain itu, Anda perlu menambahkan UITableViewDelegate dan UITableViewDataSource dalam definisi kelas sebagai daftar protokol. Jadi, definisi kelas Anda akan terlihat seperti-

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

Setelah itu lampirkan UITableViewDelegate dan UITableViewDatasource tampilan tabel Anda ke pengontrol. Pada titik ini viewController.swift Anda akan terlihat seperti-

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

PS: Jika Anda menggunakan TableViewController daripada TableView di dalam ViewController, Anda bisa melewatkan langkah ini.

Langkah 6: Seret dan lepas tampilan gambar dan label di sel Anda sesuai dengan kelas Sel. dan kemudian memberikan koneksi ke outlet mereka dari storyboard.

Langkah 7: Sekarang, tulis metode yang diperlukan UITableViewDatasource di pengontrol tampilan.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "firstCustomCell")
            //set the data here
            return cell
        }
        else if indexPath.row == 1 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "secondCustomCell")
            //set the data here
            return cell
        }
        else {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "thirdCustomCell")
            //set the data here
            return cell
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Natasha
sumber
1
Saya mendapatkan pesan: "Tidak dapat memberikan nilai jenis 'UITableViewCell' (0x1dfbfdc) ke 'Projekt.TitelTableViewCell' (0x89568)" di func cellForRowAtIndexPath. Saya menggunakan UITableViewController dan saya memiliki kelas "TitelTableViewCell" untuk sel kustom saya "TitelZelle", yang telah saya tetapkan di inspektur identitas Sel "TitelZelle". Apa yang harus saya lakukan?
Easyglider
Saya telah mencor sel saya sebagai! TitelTableViewCell untuk mengisi elemen UI kustom saya di sel ini.
Easyglider
7
coba ini => biarkan cell = tableView.dequeueReusableCellWithIdentifier ("TitelZelle", forIndexPath: indexPath) sebagai TitelTableViewCell
Natasha
2
@PradipKumar, apa masalahnya? Apa kesalahan Anda? Btw, Anda harus mengajukan pertanyaan jika Anda memiliki pertanyaan. Komentar tersebut seharusnya membantu memahami atau mengklarifikasi hal ini terkait masalah tertentu, yang telah diposting oleh penulis. Jika Anda memiliki masalah, Anda harus pergi untuk mengajukan pertanyaan dan memulai posting Anda sendiri.
Natasha
1
numberOfRowsInSection membantu tampilan tabel untuk menentukan berapa banyak baris yang kita inginkan. Jadi, Anda hanya boleh memberikan klausa yang akan membantu metode untuk menentukan jumlah baris. indexpath.row == 0 artinya Anda sudah memiliki baris tetapi pada saat itu, tabel Anda tidak tahu apakah ada baris atau tidak. Jadi, kamu harus melakukan seperti itu.
Natasha
32

Pembaruan Swift 3.0 + dengan kode minimum

Konsep dasar: Membuat tampilan tabel dengan prototipe sel dinamis. Tetapkan pengenal dan buat kelas sel tampilan tabel kustom untuk setiap prototipe sel. Memulai dan memperlihatkan sel kustom dalam metode delegasi tampilan tabel.

1. Buat sel di papan cerita

Seret tableView ke pengontrol tampilan Anda, tambahkan sel prototipe ke sana, lalu letakkan elemen UI ke sel tampilan tabel Anda, tambahkan batasan dengan benar jika diperlukan.

masukkan deskripsi gambar di sini

2. Buat UITableViewCellkelas khusus

Tambahkan kode berikut ke proyek Anda. Saya meletakkannya tepat di atas kelas view controller.

class FirstTableCell: UITableViewCell {
}

class SecondTableCell: UITableViewCell {
}

class ThirdTableCell: UITableViewCell {   
}

3. Tetapkan kelas dan pengenal khusus ke prototipe sel

Untuk setiap prototipe sel di storyboard, tetapkan kelas khusus yang dibuat dari langkah 2, lalu masukkan pengenal unik.

masukkan deskripsi gambar di sini

4. Hubungkan elemen UI ke kode swift

Kontrol seret tampilan tabel dan sambungkan ke kelas pengontrol tampilan. Kontrol seret elemen UI yang ditambahkan ke prototipe sel pada langkah 1, dan hubungkan ke kelas sel tampilan tabel yang sesuai.

masukkan deskripsi gambar di sini

5. Tambahkan kode untuk melihat pengontrol dan mengontrol tampilan tabel

Buat pengontrol tampilan Anda sesuai dengan delegasi tampilan tabel

class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Di viewDidLoad, siapkan delegasi tampilan tabel dan sumber data.

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.dataSource = self
    self.tableView.delegate = self

}

Terakhir, tambahkan dua metode delegasi untuk mengontrol tampilan tabel Anda, sesuai persyaratan minimum.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 3
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "firstTableCell") as! FirstTableCell
        // Set up cell.label
        return cell
    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondTableCell") as! SecondTableCell
        // Set up cell.button
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "thirdTableCell") as! ThirdTableCell
        // Set up cell.textField
        return cell
    }
}

6. Cobalah :)

masukkan deskripsi gambar di sini

Fangming
sumber
Fantastis! Saya suka animasi Anda.
iphaaw
Bisakah Anda memberi tahu saya, Mungkinkah memberi header untuk setiap sel? jika ya, bagaimana caranya?
Pruthvi Hariharan
@PruthviHariharan jika Anda ingin memiliki "tajuk" untuk setiap atau sebagian besar sel Anda, sebaiknya tidak menerapkan sel tajuk atau tajuk bagian, yang memerlukan lebih banyak kode untuk dikelola dan akan memengaruhi kinerja. Saran saya adalah untuk meletakkan tampilan di atas sel prototipe Anda dan membuatnya terlihat seperti "header"
Fangming
@FangmingNing Bisakah Anda menjelaskan dengan contoh kecil. Terima kasih
Pruthvi Hariharan
Anda tidak memerlukan langkah 5 jika Anda menggunakan UITableViewController sebagai ganti UIViewController.
Deepak Thakur
0

Jawaban di atas adalah jawaban terbaik, tetapi ada BANYAK alasan untuk mendapatkan masalah ini. Berikut adalah solusi potensial lain untuk siapa pun yang memiliki masalah ini:

Masalah saya adalah bahwa saya beralih ke kelas ViewController dan bukan tampilan storyboard. Jadi referensi saya ke sel papan cerita tidak ada artinya, karena papan cerita tidak digunakan.

Saya melakukan ini:

let viewControllerB = SubViewController()
viewControllerB.passedData = diseases[indexPath.row].name
navigationController?.pushViewController(viewControllerB, animated: true)

Dan saya perlu melakukan sesuatu seperti ini:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "SubViewStoryboardController") as! SubViewController
nextViewController.passedData = diseases[indexPath.row].name
self.present(nextViewController, animated:true, completion:nil)

Semoga ini bisa membantu seseorang.

Coltuxumab
sumber
-22

UITableViewControllermewarisi UIViewControlleryang sudah UITableviewDataSource& UITableviewDelegatedipetakan sendiri.

Anda bisa membuat subkelas UITableViewControlleratau menggunakan bagian TableViewdalam ViewController. Setelah itu Anda harus mengimplementasikan metode yang diperlukan ( cellForRowAtIndexPath and numberOfRowsInSection) yang dideklarasikan di UITableviewDataSource.

Juga di storyboard, Anda perlu membuat prototipe sel dengan Id unik.

Ada tipe dasar sel, dengan (judul, subtitle misalnya) - Anda juga dapat menggunakannya jika tidak memerlukan konfigurasi khusus.

Jadi, untuk pemilih, ya, Anda perlu membuat sel khusus Anda sendiri. Buat UITableViewCellpemilih tanggal penahanan kelas khusus yang diperlukan dan pastikan untuk menggunakan delegasi untuk mengirim kembali hasil yang diinginkan ke Anda ViewController.

siarheibrazil
sumber