Outlet tidak dapat dihubungkan untuk mengulangi konten iOS

144

Saya baru saja membuat aplikasi dan sudah mulai menghubungkan @ IBOutlet ke storyboard. Saya menghubungkan beberapa dari mereka ke label dalam Sel Prototipe UITableViewCell dengan Gaya Dasar. Ketika saya menghubungkannya meskipun saya mendapatkan kesalahan ini di Storyboard:

Outlet detailText dari TableViewController ke UILabel tidak valid. Outlet tidak dapat dihubungkan ke konten berulang.

Adakah yang bisa membantu saya? Saya telah mengaturnya dengan cara yang selalu saya lakukan dengan sukses, tetapi kali ini telah menghapus kesalahan ini.

Tomblasta
sumber
54
Anda tidak dapat menghubungkan label dalam sel prototipe ke IBOutlet dalam subkelas UIViewController - Anda harus menghubungkannya ke IBOutlet dalam subkelas UITableviewCell.
Paulw11
Ok terima kasih! :) Jadi supaya saya mengerti: dapatkah Anda menjelaskan mengapa?
Tomblasta
3
Karena Anda dapat memiliki jumlah sel dan hanya satu pengontrol tampilan - sehingga label sel mana yang harus dihubungkan ke pengontrol tampilan IBOutlet?
Paulw11
Oke, jadi mengapa Anda tidak bisa menggunakan cellForRowAtIndexPath untuk teks sel dalam satu pengontrol tampilan tunggal? Terima kasih!
Tomblasta
3
Karena outlet terikat ke objek (seperti label) ketika pengontrol tampilan dimuat- Pada titik itu tidak ada sel, jadi tidak ada label untuk diikat, dan jika ada sel, yang mana yang ingin Anda ikat
Paulw11

Jawaban:

168

Buat subclass sel tampilan tabel dan atur sebagai kelas prototipe. Tambahkan outlet ke kelas itu dan hubungkan mereka. Sekarang ketika Anda mengkonfigurasi sel Anda dapat mengakses outlet.

Gerbong
sumber
9
@Wain, bisakah Anda menambahkan informasi lebih lanjut tentang mengakses outlet-outlet itu?
Juan Boero
1
Juan Pablo - Apa yang dia katakan adalah normal menggunakan sel tampilan tabel kustom. Anda tidak dapat mengatur outlet untuk batasan di dalam tampilan tempat Anda menggunakan sel, sebagai gantinya Anda harus melakukannya di cellForRowAtIndexPath misalnya - customCell.constraint_row_width.constant = 25.0;
Stuart P.
70

Ada dua jenis sel tampilan tabel yang disediakan untuk Anda melalui storyboard, yaitu Dynamic Prototypes dan Static Cells

masukkan deskripsi gambar di sini

1. Prototipe Dinamis

Dari namanya, jenis sel ini dihasilkan secara dinamis. Mereka dikendalikan melalui kode Anda, bukan storyboard. Dengan bantuan delegasi tampilan tabel dan sumber data, Anda dapat menentukan jumlah sel, ketinggian sel, prototipe sel secara terprogram.

Saat Anda menyeret sel ke tampilan tabel Anda, Anda mendeklarasikan prototipe sel. Anda kemudian dapat membuat jumlah sel apa pun berdasarkan prototipe ini dan menambahkannya ke tampilan tabel melalui cellForRowmetode, secara terprogram. Keuntungan dari ini adalah bahwa Anda hanya perlu mendefinisikan 1 prototipe alih-alih membuat masing-masing dan setiap sel dengan semua tampilan ditambahkan kepada mereka sendiri (Lihat sel statis).

Jadi dalam hal ini, Anda tidak dapat menghubungkan elemen UI pada prototipe sel ke pengontrol tampilan Anda. Anda hanya akan memulai satu objek pengontrol tampilan, tetapi Anda mungkin memiliki banyak objek sel yang diinisiasi dan ditambahkan ke tampilan tabel Anda. Tidak masuk akal untuk menyambungkan prototipe sel ke pengontrol tampilan karena Anda tidak dapat mengontrol banyak sel dengan satu koneksi pengontrol tampilan. Dan Anda akan mendapatkan kesalahan jika melakukannya.

masukkan deskripsi gambar di sini

Untuk memperbaiki masalah ini, Anda perlu menghubungkan label prototipe Anda ke UITableViewCellobjek. A UITableViewCelljuga merupakan prototipe sel dan Anda dapat menginisiasi objek sel sebanyak yang Anda inginkan, masing-masingnya kemudian dihubungkan ke tampilan yang dihasilkan dari prototipe sel tabel storyboard Anda.

masukkan deskripsi gambar di sini

Terakhir, dalam cellForRowmetode Anda , buat sel khusus dari UITableViewCellkelas, dan lakukan hal-hal menyenangkan dengan label

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Sel Statis

Di sisi lain, sel statis memang dikonfigurasi melalui storyboard. Anda harus menyeret elemen UI ke setiap sel untuk membuatnya. Anda akan mengendalikan nomor sel, ketinggian, dll dari storyboard. Dalam hal ini, Anda akan melihat tampilan tabel yang persis sama dari ponsel Anda dibandingkan dengan apa yang Anda buat dari storyboard. Sel-sel statis lebih sering digunakan untuk pengaturan halaman, yang sel-selnya tidak banyak berubah.

Untuk mengontrol elemen UI untuk sel statis, Anda memang perlu menghubungkannya langsung ke pengontrol tampilan Anda, dan mengaturnya.

masukkan deskripsi gambar di sini

Fangming
sumber
@FangmingNing dalam kode saya, saya masih tidak dapat mengubah label teks, saya telah menghubungkan kelas ke sel, disebut sel yang benar dengan pengidentifikasi, tetapi masih tidak berubah
jorge saraiva
@jorgesaraiva Mari kita bahas ini di chat room chat.stackoverflow.com/rooms/159396/discuss
Fangming
Saya juga hilang ! YourCell . +100
Daniel Springer
Selalu baik untuk memiliki sedikit penyegaran setelah mengerjakan proyek hanya dalam kode selama 6 bulan.
ttorbik
Terima kasih, masalah saya adalah saya menghubungkannya ke ViewController alih-alih sel.
Stella
23

Jika Anda menggunakan tampilan tabel untuk menampilkan Pengaturan dan opsi lain (seperti yang dilakukan aplikasi Pengaturan bawaan), maka Anda dapat mengatur Konten Tampilan Tabel Anda ke Sel Statis di bawah Inspektur Atribut . Juga, untuk melakukan ini, Anda harus menyematkan Tampilan Tabel Anda dalam instance UITableViewController.

Justin Domnitz
sumber
Ini dengan cara yang lebih sederhana dan lebih cepat dan harus menjadi jawaban yang diterima imho
Jaime Agudo
5

Atau Anda tidak harus menggunakan IBOutlet untuk merujuk ke objek dalam tampilan. Anda bisa memberi Label di tableViewCell nilai Tag, misalnya mengatur Tag ke 123 (ini bisa dilakukan oleh inspektur atribut). Kemudian Anda dapat mengakses label dengan

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}
SLN
sumber
sangat mudah dan sederhana! +100
Julian Silvestri
1

Dengan saya, saya punya UIViewcontroller, dan ke dalamnya saya memiliki tampilan tabel dengan sel kustom di atasnya. Aku peta gerai saya UILabel ke UItableviewcellke UIViewControllerkemudian mendapat kesalahan.

lee
sumber
buat kelas sel khusus dan institusikan iboutlet di kelas khusus ini
Shauket Sheikh
0

Seperti kebanyakan orang telah menunjukkan bahwa subkelas UITableViewCell menyelesaikan masalah ini. Tetapi alasan ini tidak diizinkan karena sel prototipe ( UITableViewCell ) ditentukan oleh Apple dan Anda tidak dapat menambahkan outlet sendiri ke dalamnya.

Nikhil Muskur
sumber
0

Terkadang Xcode tidak dapat mengontrol koneksi outlet sel dengan benar.

Entah bagaimana label / tombol sel saya saat ini telah menghubungkan sel lain, saya hanya menghapusnya dan kesalahan hilang.

Shourob Datta
sumber
-1

Klik pada simulator, Navigasikan ke Jendela dan aktifkan Bezel Perangkat

otomatisasi eng
sumber