web-dev-qa-db-fra.com

swift UITableView set rowHeight

J'essaie de définir la hauteur de chaque ligne dans la variable tableView à la hauteur de la cellule correspondante avec ce code:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
      var cell = tableView.cellForRowAtIndexPath(indexPath)
      return cell.frame.height
}

Je reçois cette erreur lors de l'initialisation de var cell

Fil 1: EXC_BAD_ACCESS (code = 2, adresse = 0x306d2c)

50
tim_yng

Pour définir la hauteur des lignes, il existe une méthode distincte: 

Pour Swift 3

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    return 100.0;//Choose your custom row height
}

Plus ancien Swift utilise

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{
    return 100.0;//Choose your custom row height
}

Sinon, vous pouvez définir la hauteur des lignes à l'aide de:

self.tableView.rowHeight = 44.0

Dans ViewDidLoad .

112
Nagarjun

Mettez la valeur par défaut rowHeight dans viewDidLoad ou awakeFromNib. Comme l'a souligné Martin R., vous ne pouvez pas appeler cellForRowAtIndexPath à partir de heightForRowAtIndexPath

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

Essaye ça.

9
Prabhav

Comme indiqué dans les commentaires, vous ne pouvez pas appeler cellForRowAtIndexPath dans heightForRowAtIndexPath

Ce que vous pouvez faire est de créer une cellule de modèle utilisée pour peupler vos données, puis calculer sa hauteur ..___. Cette cellule ne participe pas au rendu du tableau et peut être réutilisée pour calculer la hauteur de chaque cellule.

En résumé, il consiste à configurer la cellule de modèle avec les données que vous souhaitez afficher, à la redimensionner en fonction du contenu, puis à lire sa hauteur.

J'ai pris ce code d'un projet sur lequel je travaille. Malheureusement, c'est dans l'Objectif C, je ne pense pas que vous aurez du mal à traduire en 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
Vishal Vaghasiya

Problème Cause:
Le problème est que la cellule n'a pas encore été créée. TableView calcule d'abord la hauteur d'une ligne, puis renseigne les données de chaque ligne. Le tableau de lignes n'a donc pas été créé lors de l'appel de la méthode heightForRow. Donc, votre application tente d'accéder à un emplacement de mémoire pour lequel elle n'a pas l'autorisation. Par conséquent, vous obtenez le message EXC_BAD_ACCESS

Comment réaliser l'auto-dimensionnement TableViewCell dans UITableView:
Définissez simplement les contraintes appropriées pour vos vues contenues dans la vue de TableViewCell dans StoryBoard. Rappelez-vous que vous ne devez pas définir de contraintes de hauteur pour la vue racine de TableViewCell, sa hauteur doit être correctement calculée en fonction de la hauteur de ses sous-vues. Cette procédure est similaire à celle utilisée pour définir les contraintes appropriées pour UIScrollView. De cette façon, vos cellules auront différentes hauteurs en fonction de leurs sous-vues. Aucune action supplémentaire nécessaire

2
Mehdi

Assurez-vous que votre délégué TableView fonctionne également .. Sinon, dans votre story-board ou en .xib Maintenez la touche Ctrl enfoncée tout en maintenant la touche Ctrl enfoncée, puis cliquez à l'aide du bouton droit de la souris sur le glisser-déposer de la table dans votre ViewController actuel. Swift 2.0

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