web-dev-qa-db-ja.com

swift UITableView set rowHeight

このコードを使用して、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)

54
tim_yng

行の高さを設定するには、別の方法があります。

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で。

126
Nagarjun

デフォルトのrowHeightviewDidLoadまたはawakeFromNibに入れます。 Martin R.が指摘したように、cellForRowAtIndexPathからheightForRowAtIndexPathを呼び出すことはできません

self.tableView.rowHeight = 44.0
50
Mundi
yourTableView.rowHeight = UITableViewAutomaticDimension

これを試して。

10
Prabhav

コメントで指摘されているように、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;
}
6
Antonio
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            var height:CGFloat = CGFloat()
            if indexPath.row == 1 {
                height = 150
            }
            else {
                height = 50
            }

            return height
        }
5

問題の原因:
問題は、セルがまだ作成されていないことです。 TableViewは最初に行の高さを計算し、次に各行のデータを設定します。したがって、heightForRowメソッドが呼び出されたときに行配列は作成されていません。そのため、アプリは許可のないメモリロケーションにアクセスしようとしているため、EXC_BAD_ACCESSメッセージを取得します。

セルフサイジングを達成する方法TableViewCell in UITableView
TableViewCellStoryBoardのビューに含まれるビューに適切な制約を設定するだけです。 TableViewCellのルートビューに高さの制約を設定しないでください。その高さは、サブビューの高さで適切に計算できる必要があります。これは、UIScrollViewに適切な制約を設定するのと同じです。このようにして、セルはサブビューに従って異なる高さを取得します。追加のアクションは不要

2
Mehdi

TableViewデリゲートも機能していることを確認してください。そうでない場合は、ストーリーボードまたは.xibで、Ctrlキーを押しながらtableViewを右クリックして、現在のViewControllerにドラッグアンドドロップします。 Swift 2.

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 60.0;
}
1
Ameer Chand