回答:
私の場合、戻り高さと推定高さを強制すると警告が消えました。
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
2つのオーバーライドを必要としない別の解決策は、単にself.tableView.rowHeight = 44;
、loadView
またはinitメソッドで使用することです。
また、コンテンツビューの上部から下部に垂直方向の制約を追加することもできます。これで自動レイアウトが楽しくなります(セルの高さを自分で計算する方法を知っているため)。
autoLayout制約とUITableViewAutomaticDimensionを使用している場合、このエラーは、コードで高さをオーバーライドすることによって破棄される誤った問題ではありません。これは、必要な適切な垂直方向の制約がないため、セルの高さを自動的に決定することが機能しないことを意味します。
私と同じようにこのエラーが発生し、どのセルがエラーをスローしているかを特定するのに助けが必要な場合は、 'heightforRowAtIndexPath'メソッドが返される直前に次の行を追加できます。
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
これにより、セクションと行の長いリストが出力されますが、エラーの原因となっている特定のセルの直後にエラーが表示され、問題の原因となっているセルをすばやく特定して、それに応じて制約を修正できます。これは、静的セルに特に役立ちます。autoLayoutと自動セルの高さを使用していない場合は、手動で入力した数値で高さをオーバーライドできますが、基本的にこれらの機能を無効にします。
以前 'heightForRowAtIndexPath'メソッドを使用していなかったが、UITableViewAutomaticDimension設定を元に戻さずにこのエラーをデバッグしたい場合は、これをコードに追加してください:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
return UITableViewAutomaticDimension;
}
自動レイアウトを使用し、各テーブルビューセルの行の高さの値を指定せず、代わりに「デフォルト」の値のままにすると、この問題の原因となるXCode 6.1にバグがあるようです。すべてのセルについて、行の高さの横にある「カスタム」チェックボックスをオンにするだけで、警告が表示されなくなります。
制約は、レイアウトの目的には適していますが、行の自動高さの目的には適していません。幸せなレイアウトは、コンテンツが曖昧さなくレイアウトできることを意味します。これは、Interface Builderのチェックを満たすでしょう。
自動行の高さのレイアウトが適切であれば、上記に加えて、セルの下部への制約も含めることになります。
この警告が表示された場合は、自動レイアウトを使用していて、セル内に制約がないためと考えられます。
自動レイアウトの使用を停止するか、セルの高さを明確に定義する制約を実装する必要があります。
右側のファイルインスペクタで[Autolayoutを使用]オプションをオフにすると、インターフェースビルダーで自動レイアウトをオフにできます。
自動レイアウトを使用することを選択し、セルの高さが固定されている場合、適切な制約の実装は簡単です。セルのコンテンツビューのサブビューに高さの制約を追加し、サブビュー間、およびサブビューとコンテンツビューの間に垂直方向のスペース制約を実装するだけです。たとえば、セルにラベルが1つある場合、これは機能します。
垂直方向の制約
水平拘束
AutoLayoutを使用して、適切な高さを計算できます。iOS 8のダイナミックセルの高さに関する素晴らしい投稿は次のとおりです。http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
沼地の標準修正の場合、制約なし、高さの見積もりなし、または問題の過剰設計。デフォルトのプロジェクトを作成し、テーブルビューを接続しましたが、ビューコントローラーに高さの代理オブジェクトを配置するのを忘れていました。この警告を単に消すには、これが必要です。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44;
}
テーブルのビューコントローラー。
私の場合は、xibを使用してセルを設計しているので、そのxibファイルをターゲットに追加するのを忘れています。
そのxibファイルをターゲットに追加した後、問題はなくなりました
高さの制約を追加するか、heightForRowAtIndexPathで44のようなrowHeightsを手動で返すことを論じているこのページの答えは警告を消しますが、これはXcodeのバグであるため、不必要です。少なくともバージョン6.3.2(6D2105)で表示さです。
viewDidLoadにブレークポイントを設定すると、ストーリーボードで行の高さを44に指定した場合でも、self.tableView.rowHeight = -1(UITableViewAutomaticDimension)が表示されます。これは、行の高さを44のままにしておくと、Appleが動的な行の高さを求めると誤って想定するためです。これは、ユーザーが設定を指定するためのフラグを提供しなかったためです。
考えられる解決策とその結果は次のとおりです。
ストーリーボード(作品)で行の高さを43または45に設定します。
heightForRowAtIndexPathで高さ44を手動で返します(機能します)。
UITableViewCellの要素とそのcontentView(機能)の間に高さの制約を追加します。
残念ながら、これらのソリューションでは、設計を変更するか、不要な制約を追加するか、バグを回避するために不要なコードを追加する必要があります。私は(私が思っていたもの)最も簡単な解決策を試しました:
私は本当にこれに対する純粋なストーリーボードソリューションを望んでいたので、最終的に私は試しました:

これらのバグはすべてiOS開発では一般的すぎるため、開発者はソリューションが長期的にメンテナンス性にどのように影響するかという影響を検討するために過度の時間を費やす必要があります。
保守可能で難読化されていないように見える概念的に正しいソリューションを見つけることは非常に難しいため、Appleがバグを修正し、44が近い将来のデフォルトの行の高さになるとすると、制約またはユーザー定義ランタイム属性ソリューションは、おそらく最も保守しやすいものです。
ここでは、2つの重要なことが起こっていると思います。
1)Ctrlキーを押しながらドラッグしている場合、制約を誤って設定するのは非常に簡単です。したがって、正しく実行されていることを再確認してください。これらの制約を描画するには、画面の左側にあるトレイを使用するのが最適です。
2)ViewDidLoadまたは他の場所で見積もった行の高さを指定する代わりに、デリゲートメソッドを使用します。
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
これで問題はすぐに解決しました。
このエラーと、制約が作成されていて(どこにあるかわからない)別のエラーが発生するまで、私は何日も何度も何度も何度も何度も行きましたが、これは私が望む制約と矛盾していました。私は、すべての表示可能なプロパティが他のプロパティと同一である1つのインスタンスでそれを機能させていました。私が見つけた唯一の解決策はアトミックにすることでした-xibで完全に新しいファイルを作成し、古いコードをコピーして貼り付けてアウトレットの再接続を再開します。これは最善の解決策ではないかもしれませんが、問題が見えない場合は、他にできることはほとんどありません。少なくとも、アトミックにすることは何が起こっているのかを検討するための良い方法です。