コンセントは繰り返しコンテンツiOSに接続できません


144

アプリを作成し、@ IBOutletをストーリーボードに接続し始めました。それらのいくつかを、基本スタイルのUITableViewCellプロトタイプセルのラベルに接続しています。ストーリーボードにこのエラーが表示されますが、接続すると:

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

誰かが私を助けてくれますか?私はいつもうまくいくように設定しましたが、今回はこのエラーを解消しました。


54
プロトタイプセルのラベルをUIViewControllerサブクラスのIBOutletに接続することはできません。UITableviewCellサブクラスのIBOutletに接続する必要があります。
Paulw11 2014年

ありがとうございます!:)だから私は理解しています。理由を説明できますか?
Tomblasta 2014年

3
任意の数のセルと単一のビューコントローラーのみを使用できるため、どのセルのラベルをビューコントローラーIBOutletに接続する必要がありますか?
Paulw11 2014年

では、なぜ1つのビューコントローラのセルテキストにcellForRowAtIndexPathを使用できないのでしょうか。ありがとう!
Tomblasta 2014年

3
出口はビューコントローラは、負荷のかかっている(ラベルなど)のオブジェクトにバインドされているので、その時点で、あなたがバインドにしたいんでした1細胞あった、バインドにラベルなしそう、とあれば、何の細胞が存在しない
Paulw11

回答:


168

テーブルビューのセルサブクラスを作成し、プロトタイプのクラスとして設定します。そのクラスにコンセントを追加して接続します。セルを構成すると、コンセントにアクセスできるようになります。


9
@ウェインは、これらのアウトレットへのアクセスに関する詳細情報を追加していただけませんか?
ファンボエロ2015年

1
Juan Pablo-彼が言っていることは、カスタムテーブルビューセルを使用するのが普通だということです。セルを使用しているビュー内の制約のアウトレットを設定することはできません。代わりに、例えばcellForRowAtIndexPathでそれを行う必要があります-customCell.constraint_row_width.constant = 25.0;
スチュアートP.

70

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

ここに画像の説明を入力してください

1.動的プロトタイプ

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

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

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

ここに画像の説明を入力してください

この問題を解決するには、プロトタイプラベルをUITableViewCellオブジェクトに接続する必要があります。A 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要素を制御するには、実際にそれらをビューコントローラーに直接接続して設定する必要があります。

ここに画像の説明を入力してください


コードで@FangmingNingを使用しても、テキストラベルを変更できません。クラスをセルに接続しました。識別子付きの正しいセルと呼ばれますが、変更されません
jorge saraiva

@jorgesaraivaレッツ・チャットルームでこれを議論するchat.stackoverflow.com/rooms/159396/discuss
Fangming

として欠けていた!YourCell+100
Daniel Springer、

6か月間だけコードでプロジェクトに取り組んだ後、少し復習しておくとよいでしょう。
ttorbik

おかげで、私の問題は、セルではなくViewControllerに接続していることです。
ステラ

23

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


これはより簡単で迅速な方法であり、受け入れられた答えであるべきですimho
Jaime Agudo

5

または、ビューのオブジェクトを参照するために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 
}

とても簡単でシンプル!+100
ジュリアンシルヴェストリ

1

私にはがありUIViewcontroller、それにカスタムセルを含むテーブルビューがあります。UILabelのアウトレットをにマップするUItableviewcellUIViewController、エラーが発生しました。


カスタムセルクラスを作成し、このカスタムクラスでiboutletをインスタンス化します
Shauket Sheikh

0

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


0

Xcodeは、セルアウトレット接続を正しく制御できない場合があります。

どういうわけか、現在のセルのラベル/ボタンが別のセルに接続しているので、それらを削除するだけでエラーはなくなります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.