アプリを作成したばかりで、@ IBOutletをストーリーボードにフックし始めました。私はそれらのいくつかを基本スタイルのUITableViewCellプロトタイプセルのラベルに接続しています。ストーリーボードでこのエラーが発生しますが、接続すると次のようになります。
TableViewControllerからUILabelへのdetailTextアウトレットが無効です。アウトレットを繰り返しコンテンツに接続することはできません。
誰かが私を手伝ってくれる?私はいつもうまくいくように設定しましたが、今回はこのエラーを回避しました。
Table View Cellのサブクラスを作成し、それをプロトタイプのクラスとして設定します。そのクラスにアウトレットを追加してそれらを接続します。これでセルを設定するとアウトレットにアクセスできます。
ストーリーボードを通じて提供されるテーブルビューセルには、動的プロトタイプと静的セルの2種類があります。
1。動的プロトタイプ
名前から、このタイプのセルは動的に生成されます。それらはストーリーボードではなくあなたのコードを通して制御されます。 Table Viewのデリゲートとデータソースを使用して、セルの数、セルの高さ、セルのプロトタイプをプログラムで指定できます。
セルをテーブルビューにドラッグすると、セルのプロトタイプが宣言されます。その後、このプロトタイプに基づいて任意の数のセルを作成し、プログラム的にcellForRow
メソッドを介してそれらをテーブルビューに追加できます。これの利点は、すべてのビューを自分で追加して各セルを作成するのではなく、プロトタイプを1つ定義するだけでよいことです(静的セルを参照)。
そのため、この場合、セルプロトタイプのUI要素をView Controllerに接続することはできません。 1つのView Controllerオブジェクトのみが開始されますが、多くのセルオブジェクトが開始されてTable Viewに追加されることがあります。 1つのView Controller接続で複数のセルを制御することはできないため、セルのプロトタイプをView Controllerに接続することは意味がありません。そうするとエラーになります。
この問題を解決するには、プロトタイプラベルをUITableViewCell
オブジェクトに接続する必要があります。 UITableViewCell
はセルのプロトタイプでもあり、好きなだけセルオブジェクトを開始できます。それぞれのセルオブジェクトはストーリーボードテーブルのセルプロトタイプから生成されたビューに接続されます。
最後に、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に直接接続して設定する必要があります。
設定やその他のオプションを表示するためにテーブルビューを使用している場合(組み込みの設定アプリのように)、Table View ContentをStatic Cellsに設定できます。 属性インスペクタの下。また、これを行うには、Table ViewをUITableViewControllerインスタンスに埋め込む必要があります。
または、ビュー内のオブジェクトを参照するために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
}
私と一緒にUIViewcontroller
があり、その中にカスタムセルを含むテーブルビューがあります。 UILabelのアウトレットをUItableviewcell
からUIViewController
にマッピングしたところ、エラーが発生しました。
ほとんどの人が指摘しているようにサブクラス化UITableViewCell
はこの問題を解決します。しかし、プロトタイプセル(ITableViewCell)はAppleによって定義されており、独自のアウトレットを追加することはできないため、これは許可されません。