このコードを使用して、tableView
の各行の高さを対応するセルの高さに設定しようとしています。
override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
var cell = tableView.cellForRowAtIndexPath(indexPath)
return cell.frame.height
}
var cell
の初期化時にこのエラーが発生します。
スレッド1:EXC_BAD_ACCESS(code = 2、address = 0x306d2c)
行の高さを設定するには、別の方法があります。
Swiftの場合
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100.0;//Choose your custom row height
}
古いSwiftは
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 100.0;//Choose your custom row height
}
それ以外の場合は、次を使用して行の高さを設定できます
self.tableView.rowHeight = 44.0
ViewDidLoadで。
デフォルトのrowHeight
をviewDidLoad
またはawakeFromNib
に入れます。 Martin R.が指摘したように、cellForRowAtIndexPath
からheightForRowAtIndexPath
を呼び出すことはできません
self.tableView.rowHeight = 44.0
yourTableView.rowHeight = UITableViewAutomaticDimension
これを試して。
コメントで指摘されているように、cellForRowAtIndexPath
内でheightForRowAtIndexPath
を呼び出すことはできません。
できることは、データを入力してその高さを計算するために使用するテンプレートセルを作成することです。このセルは表のレンダリングに関与せず、各表のセルの高さを計算するために再利用できます。
簡単に言えば、表示したいデータでテンプレートセルを構成し、コンテンツに応じてサイズを変更し、その高さを読み取ります。
私は現在取り組んでいるプロジェクトからこのコードを取得しました-残念ながらObjective Cにありますが、Swiftへの翻訳に問題があるとは思わない
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
static PostCommentCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tblComments dequeueReusableCellWithIdentifier:POST_COMMENT_CELL_IDENTIFIER];
});
sizingCell.comment = self.comments[indexPath.row];
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height:CGFloat = CGFloat()
if indexPath.row == 1 {
height = 150
}
else {
height = 50
}
return height
}
問題の原因:
問題は、セルがまだ作成されていないことです。 TableViewは最初に行の高さを計算し、次に各行のデータを設定します。したがって、heightForRowメソッドが呼び出されたときに行配列は作成されていません。そのため、アプリは許可のないメモリロケーションにアクセスしようとしているため、EXC_BAD_ACCESS
メッセージを取得します。
セルフサイジングを達成する方法TableViewCell
in UITableView
:TableViewCell
のStoryBoard
のビューに含まれるビューに適切な制約を設定するだけです。 TableViewCellのルートビューに高さの制約を設定しないでください。その高さは、サブビューの高さで適切に計算できる必要があります。これは、UIScrollView
に適切な制約を設定するのと同じです。このようにして、セルはサブビューに従って異なる高さを取得します。追加のアクションは不要
TableViewデリゲートも機能していることを確認してください。そうでない場合は、ストーリーボードまたは.xibで、Ctrlキーを押しながらtableViewを右クリックして、現在のViewControllerにドラッグアンドドロップします。 Swift 2.
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60.0;
}