web-dev-qa-db-ja.com

アウトレットはiOSの繰り返しコンテンツに接続できません

アプリを作成したばかりで、@ IBOutletをストーリーボードにフックし始めました。私はそれらのいくつかを基本スタイルのUITableViewCellプロトタイプセルのラベルに接続しています。ストーリーボードでこのエラーが発生しますが、接続すると次のようになります。

TableViewControllerからUILabelへのdetailTextアウトレットが無効です。アウトレットを繰り返しコンテンツに接続することはできません。

誰かが私を手伝ってくれる?私はいつもうまくいくように設定しましたが、今回はこのエラーを回避しました。

131
Tomblasta

Table View Cellのサブクラスを作成し、それをプロトタイプのクラスとして設定します。そのクラスにアウトレットを追加してそれらを接続します。これでセルを設定するとアウトレットにアクセスできます。

158
Wain

ストーリーボードを通じて提供されるテーブルビューセルには、動的プロトタイプ静的セルの2種類があります。

enter image description here

1。動的プロトタイプ

名前から、このタイプのセルは動的に生成されます。それらはストーリーボードではなくあなたのコードを通して制御されます。 Table Viewのデリゲートとデータソースを使用して、セルの数、セルの高さ、セルのプロトタイプをプログラムで指定できます。

セルをテーブルビューにドラッグすると、セルのプロトタイプが宣言されます。その後、このプロトタイプに基づいて任意の数のセルを作成し、プログラム的にcellForRowメソッドを介してそれらをテーブルビューに追加できます。これの利点は、すべてのビューを自分で追加して各セルを作成するのではなく、プロトタイプを1つ定義するだけでよいことです(静的セルを参照)。

そのため、この場合、セルプロトタイプのUI要素をView Controllerに接続することはできません。 1つのView Controllerオブジェクトのみが開始されますが、多くのセルオブジェクトが開始されてTable Viewに追加されることがあります。 1つのView Controller接続で複数のセルを制御することはできないため、セルのプロトタイプをView Controllerに接続することは意味がありません。そうするとエラーになります。

enter image description here

この問題を解決するには、プロトタイプラベルをUITableViewCellオブジェクトに接続する必要があります。 UITableViewCellはセルのプロトタイプでもあり、好きなだけセルオブジェクトを開始できます。それぞれのセルオブジェクトはストーリーボードテーブルのセルプロトタイプから生成されたビューに接続されます。

enter image description here

最後に、cellForRowメソッドで、UITableViewCellクラスからカスタムセルを作成し、ラベルを使って楽しいことをします。

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。静的セル

一方、静的セルはストーリーボードを介して実際に構成されています。 UI要素を作成するには、すべてのセルにUI要素をドラッグする必要があります。あなたはストーリーボードからセル数、高さなどをコントロールします。この場合は、ストーリーボードから作成したものと比べて、携帯電話のものとまったく同じテーブルビューが表示されます。静的セルはページを設定するために使用されることが多く、セルはそれほど変更されません。

スタティックセルのUI要素を制御するには、実際にそれらをView Controllerに直接接続して設定する必要があります。

enter image description here

50
Fangming

設定やその他のオプションを表示するためにテーブルビューを使用している場合(組み込みの設定アプリのように)、Table View ContentStatic Cellsに設定できます。 属性インスペクタの下。また、これを行うには、Table ViewをUITableViewControllerインスタンスに埋め込む必要があります。

22
Justin Domnitz

または、ビュー内のオブジェクトを参照するためにIBOutletを使用する必要はありません。ラベルにtableViewCellタグ値を付けることができます。たとえば、タグを123に設定します。 =(これは属性インスペクタによって行われます)。それからラベルにアクセスすることができます

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 
}
4
SLN

私と一緒にUIViewcontrollerがあり、その中にカスタムセルを含むテーブルビューがあります。 UILabelのアウトレットをUItableviewcellからUIViewControllerにマッピングしたところ、エラーが発生しました。

1
lee

ほとんどの人が指摘しているようにサブクラス化UITableViewCellはこの問題を解決します。しかし、プロトタイプセル(ITableViewCell)はAppleによって定義されており、独自のアウトレットを追加することはできないため、これは許可されません。

0
Nikhil Muskur