1. ホーム
  2. ios

[解決済み] SwiftでnibからカスタムUITableViewCellを作る

2022-04-27 19:27:26

質問

nibからカスタムテーブルビューセルを作成しようとしています。この記事を参考にしています こちら . 私は2つの問題に直面しています。

UITableViewCellオブジェクトがドラッグされた.xibファイルを作成しました。のサブクラスを作成しました。 UITableViewCell を作成し、それをセルのクラスとして設定し セル を再利用可能な識別子として使用します。

import UIKit

class CustomOneCell: UITableViewCell {

    @IBOutlet weak var middleLabel: UILabel!
    @IBOutlet weak var leftLabel: UILabel!
    @IBOutlet weak var rightLabel: UILabel!

    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

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

        // Configure the view for the selected state
    }

}

UITableViewControllerの中に、こんなコードがあります。

import UIKit

class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    var items = ["Item 1", "Item2", "Item3", "Item4"]

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

    // MARK: - UITableViewDataSource
    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let identifier = "Cell"
        var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
        if cell == nil {
            tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
            cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
        }

        return cell
    }
}

このコードはエラーもなく準拠していますが、シミュレータで実行すると次のようになります。

ストーリーボードにあるUITableViewControllerでは、セルに対して何もしていない。空白の識別子とサブクラスがない。を追加してみた。 セル をプロトタイプのセルに追加して再度実行しましたが、同じ結果になりました。

もう一つ、UITableViewControllerに以下のメソッドを実装しようとしたところ、エラーが発生しました。

override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {

    cell.middleLabel.text = items[indexPath.row]
    cell.leftLabel.text = items[indexPath.row]
    cell.rightLabel.text = items[indexPath.row]
}

紹介した記事にあるように、私が変更したのは cell パラメータのタイプフォーム UITableViewCellCustomOneCell UITableViewCellのサブクラスです。しかし、次のようなエラーが発生します。

セレクタ 'tableView:willDisplayCell:forRowAtIndexPath:' を持つメソッドをオーバーライドすると、互換性のない型 '(UITableView!, CustomOneCell!, NSIndexPath!) -> ()' が存在することになります。

これらのエラーを解決する方法をご存知の方はいらっしゃいますか?これらはObjective-Cでは問題なく動作しているようです。

ありがとうございました。

EDIT: 今気づいたのですが、シミュレータの向きを横にして、縦に戻すとセルが表示されるんですね!?まだ、何が起こっているのかわかりませんでした。Xcodeプロジェクトをアップロードしました。 ここで お時間があれば、この問題のデモをご覧ください。

どのように解決するのですか?

Swift 5 と iOS 12.2 では、以下のコードを試すと問題が解決するはずです。

CustomCell.swift

import UIKit

class CustomCell: UITableViewCell {

    // Link those IBOutlets with the UILabels in your .XIB file
    @IBOutlet weak var middleLabel: UILabel!
    @IBOutlet weak var leftLabel: UILabel!
    @IBOutlet weak var rightLabel: UILabel!

}

TableViewController.swift

import UIKit

class TableViewController: UITableViewController {

    let items = ["Item 1", "Item2", "Item3", "Item4"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
    }

    // MARK: - UITableViewDataSource

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

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

        cell.middleLabel.text = items[indexPath.row]
        cell.leftLabel.text = items[indexPath.row]
        cell.rightLabel.text = items[indexPath.row]

        return cell
    }

}


以下の画像は、Xcodeからの制約のambiguityメッセージなしに、提供されたコードで動作する制約のセットを示しています。