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)
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 .
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
yourTableView.rowHeight = UITableViewAutomaticDimension
Essaye ça.
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;
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height:CGFloat = CGFloat()
if indexPath.row == 1 {
height = 150
}
else {
height = 50
}
return height
}
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
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;
}