web-dev-qa-db-ja.com

SwiftカスタムUITableViewCellラベルは常にnilです

私は何日もこの問題に悩まされてきたので、誰かが助けてくれると本当に嬉しいです。各セルにいくつかのUILabelsとUIButtonが必要なため、カスタムUITableViewサブクラスを作成し、カスタムUITableViewCellサブクラスも作成した動的UITableViewを作成しようとしています。セルが作成されますが、問題はラベルの値が常にnilであるため、セルが適切に表示されないことです。 これは 、ストーリーボードの外観、および これは プログラムの実行中に表示されるもの。

これが私のUITableViewCellサブクラスです:

import UIKit

class QuestionTableViewCell: UITableViewCell {

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!

}

そして私のUITableViewサブクラス:

import UIKit

class QuestionViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var table: UITableView!
     struct Question {
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        table.estimatedRowHeight = 50
        table.dataSource = self
        table.delegate = self
        self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
    }

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

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk?.text = "25/A"
        cell.topic?.text = "string"
        cell.answers?.text = "3"
        return cell
    }
}
24
Dávid Pásztor

self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")を削除してみてください

60
Badie

Nibでセルを使用している場合は、registerNib:forCellReuseIdentifier:を使用してセルをテーブルビューに登録していることを確認してください。セルにクラスがある場合は、registerClass:forCellReuseIdentifier:を使用します。

23
Nick Venn

まず、クラスがInterface Builderに存在する場合は、クラスを登録する必要はありません。

次に、dequeueReusableCellWithIdentifier:forIndexPathの代わりにdequeueReusableCellWithIdentifier

第3に、UITableViewControllerにはすでにtableViewというプロパティがあるため、UITableViewControllerがすでにこれを処理しているため、tableにIBOutletを作成する必要はありません。また、UITableViewDataSourceおよびUITableViewDataSourceにも準拠しているため、これらは無関係です。

4番目に、tableのプロパティを設定しないでください。tableViewのプロパティを設定してください。

5番目、cell.labDesk.text = ""で十分です。オプションにする必要はありません。

すべてのIBOutletが接続され、セル識別子が正しく設定されていて、これらの修正が行われていれば、機能します。

class QuestionTableViewCell: UITableViewCell {

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!

}


class QuestionViewController: UITableViewController {

    struct Question {
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 50
        tableView.dataSource = self
        tableView.delegate = self
    }

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

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk.text = "25/A"
        cell.topic.text = "string"
        cell.answers.text = "3"
        return cell
    }
}
7
Ian

私はここで遅れるかもしれませんが、私は同じような問題を解決しました。

UITableViewCellのInterfaceBuilderで識別子を設定していることを確認してください。

enter image description here

3
Eric Conner

考えられるすべての解決策を試した後でも、これを理解しようとしている人のために:

ストーリーボードのIBOutletsを切断/再接続するとうまくいきます!

1
Jason LAPIERRE

最も重要な部分は、カスタムセルを含むxibをテーブルビューに登録することです。したがって、viewDidLoad()メソッドに次のコードを追加します。

let nib = UINib.init(nibName: "MyCustomCell", bundle: nil)    
self.tblUsers.register(nib, forCellReuseIdentifier: "MyCustomCell")
1
Ammar Mujeeb

Xibでテーブルセルを使用している場合。セルを..に登録する必要があります。

register(_:forCellReuseIdentifier:)
0
Yodagama