誰もこれをデバッグする方法を知っていますか?
警告は1回のみ:制約がTableviewセルのコンテンツビューの高さ0をあいまいに示唆するケースを検出しました。意図しない折りたたみを検討しており、代わりに標準の高さを使用しています。
行には、次のように設定された固定の高さがあります。
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
そして、すべてのconstraints
は幸せそうです...
私の場合、戻り高さと推定高さを強制すると警告が消えました。
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
2つのオーバーライドを必要としない別の解決策は、loadView
またはinitメソッドでself.tableView.rowHeight = 44;
を使用することです。
また、コンテンツビューの上部と下部から垂直方向の制約を追加することもできます。これにより、自動レイアウトが幸せになります(セルの高さを自分で計算する方法を知っているため)。
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にバグがあり、この問題が発生するようです。すべてのセルについて、行の高さの横にある「カスタム」チェックボックスをオンにすると、警告が消えます。
はい、テーブルビューセル内のアイテムに水平方向の制約しかない場合でも、すべての制約が「幸せ」になります。同じ問題がありました。垂直制約も追加する必要があります。そうすることで、その警告は消えます。
テーブルビューのサイズインスペクターで行の高さ43(または<> 44)を使用すると、エラーが消えました。 44を使用すると、エラーが発生します。 Xcodeバージョン6.0.1。
-この回答はモデレーターによって削除されましたが、しないでください、問題を修正します。これは私のために問題を解決し、他の人にもそれをするかもしれません。再度削除しないでください。
制約はレイアウトの目的には満足できますが、自動行高の目的には満足できません。幸せなレイアウトとは、曖昧さなくコンテンツをレイアウトできることを意味します。これは、Interface Builderのチェックを満たします。
行の高さを自動的に調整するための幸せなレイアウトは、上記に加えて、セルの下部にも制約を含めることを意味します。
この警告が表示される場合、自動レイアウトを使用しており、セルに内部の制約がないためです。
自動レイアウトの使用を停止するか、セルの高さを明確に定義する制約を実装する必要があります。
右側のファイルインスペクターで[Use Autolayout]オプションのチェックを外すと、インターフェースビルダーで自動レイアウトをオフにできます。
自動レイアウトの使用を選択し、セルの高さが固定されている場合、適切な制約の実装は簡単です。セルのコンテンツビューのサブビューに高さの制約を追加し、サブビュー間、およびサブビューとコンテンツビューの間に垂直方向のスペース制約を実装するだけです。たとえば、セルにラベルが1つある場合、これは機能します。
垂直制約
水平方向の制約
警告を削除することはできませんでしたが、制約を機能させるために、iOS8のtableviewプロパティestimatedRowHeight
を固定の高さに設定し、heightForRowAtIndexPath
実装を削除しました。
AutoLayoutを使用して、適切な高さを計算できます。 iOS 8での動的セルの高さに関する素晴らしい投稿を次に示します。 http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
沼地の標準的な修正の場合、制約なし、高さの推定なし、または問題の過剰なエンジニアリング。デフォルトのプロジェクトを作成し、TableViewを接続しましたが、View ControllerにHeightデリゲートを配置するのを忘れていました。単にこの警告を消すには、これが必要です。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44;
}
テーブルのView Controller内。
Swiftで高さを強制的に設定すると、問題が解決しました。
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if(indexPath.row == 0){
return CGFloat(131.0)
}else if(indexPath.row == 8){
return CGFloat(97.0)
}else{
return CGFloat(44.0)
}
}
ここで起こっている2つの重要なことがあります。
1)Ctrlキーを押しながらドラッグすると、制約を間違ったものにするのは非常に簡単です。したがって、正しく実行されていることを再確認してください。これらの制約を描くには、画面の左側のトレイを使用するのが最善です。
2)ViewDidLoadまたは他の場所でexpectedRowHeightを指定する代わりに、デリゲートメソッドを使用します。
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
これですぐに問題が解決しました。
このエラーと、必要な制約と競合する制約が作成されている(場所がわからない)別のエラーの間を何日も何度も行き来しました。すべての表示可能なプロパティが他のプロパティと同一である1つのインスタンスで動作することさえありました。私が見つけた唯一の解決策は、アトミックにすることでした-xibを使用して完全に新しいファイルを作成し、古いコードをコピーして貼り付けてコンセントを再接続し直します。それは最善の解決策ではないかもしれませんが、問題が目に見えない場合、他にやることがほとんどないことがあります。少なくとも、アトミックにすることは、何が起こっているのかを確認する良い方法です。
私の場合、それはxibを使用してセルを設計しているためであり、そのxibファイルをターゲットに追加するのを忘れています。
そのxibファイルをターゲットに追加すると、問題はなくなりました
このページの回答では、高さの制約を追加すること、またはheightForRowAtIndexPathの44のようなrowHeightsを手動で返すことで警告が消えますが、これはXcode少なくともバージョン6.3.2(6D2105)で表示されます。
ViewDidLoadでブレークポイントを設定すると、ストーリーボードで行の高さを44に指定しても、self.tableView.rowHeight = -1(UITableViewAutomaticDimension)が表示されます。これは、Appleは、行の高さを44のままにした場合、動的な行の高さが必要だと誤って想定するためです。
考えられる解決策とその結果は次のとおりです。
ストーリーボード(作業)で行の高さを43または45に設定します。
HeightForRowAtIndexPathに手動で44の高さを返します(機能)。
UITableViewCellの要素とそのcontentViewの間に高さの制約を追加します(機能します)。
残念ながら、これらのソリューションでは、設計を変更するか、不要な制約を追加するか、バグを回避するために不要なコードを追加する必要があります。私は(私が思っていた)最も簡単な解決策を試しました:
私はこれに対する純粋なストーリーボードソリューションが本当に欲しかったので、ついに試しました:

これらのバグはすべてiOS開発ではあまりにも一般的であり、開発者がソリューションが長期的に保守性にどのように影響するかの影響を評価するために過度の時間を費やすことを余儀なくされます。
保守可能で、難読化されていないように見える概念的に正しいソリューションを見つけることは非常にわかりにくいため、Appleがバグを修正し、44が予見可能な将来のデフォルトの行の高さになると仮定すると、制約またはユーザー定義の実行時属性ソリューションがおそらく最もメンテナンスしやすいでしょう。
ユニバーサルストーリーボードまたはxibを使用しているときにもこのエラーが発生しました。 Any x Anyサイズクラスに適切な制約を指定しないと、このエラーが表示されます。
AppleはiOS9でこれを修正したようです。エラーは私にとって8.4でのみ発生しました。