La question est simple: comment charger des UITableViewCell
fichiers personnalisés à partir de fichiers Xib? Cela vous permet d'utiliser Interface Builder pour concevoir vos cellules. La réponse n'est apparemment pas simple en raison de problèmes de gestion de la mémoire. Ce fil mentionne le problème et suggère une solution, mais est pré-version NDA et manque de code. Voici un long fil conducteur qui discute du problème sans fournir de réponse définitive.
Voici un code que j'ai utilisé:
static NSString *CellIdentifier = @"MyCellIdentifier";
MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
cell = (MyCell *)[nib objectAtIndex:0];
}
Pour utiliser ce code, créez MyCell.m / .h, une nouvelle sous-classe de UITableViewCell
et ajoutez IBOutlets
pour les composants souhaités. Créez ensuite un nouveau fichier "Empty XIB". Ouvrez le fichier Xib dans IB, ajoutez un UITableViewCell
objet, définissez son identifiant sur "MyCellIdentifier" et définissez sa classe sur MyCell et ajoutez vos composants. Enfin, connectez le IBOutlets
aux composants. Notez que nous n'avons pas défini le propriétaire du fichier dans IB.
D'autres méthodes préconisent de définir le propriétaire du fichier et avertissent des fuites de mémoire si le Xib n'est pas chargé via une classe d'usine supplémentaire. J'ai testé ce qui précède sous Instruments / Leaks et je n'ai vu aucune fuite de mémoire.
Alors, quelle est la manière canonique de charger des cellules à partir de Xibs? Définissons-nous le propriétaire du fichier? Avons-nous besoin d'une usine? Si oui, à quoi ressemble le code de l'usine? S'il existe plusieurs solutions, clarifions les avantages et les inconvénients de chacune d'entre elles ...
la source
Réponses:
Voici deux méthodes qui, selon l' auteur d'origine, ont été recommandées par un ingénieur de l'IB .
Voir le message réel pour plus de détails. Je préfère la méthode # 2 car elle semble plus simple.
Méthode n ° 1:
Méthode n ° 2:
Mise à jour (2014): la méthode # 2 est toujours valide mais il n'y a plus de documentation pour elle. Auparavant, il figurait dans les documents officiels, mais il est maintenant supprimé au profit des story-boards.
J'ai publié un exemple de travail sur Github:
https://github.com/bentford/NibTableCellExample
modifier pour Swift 4.2
la source
La bonne solution est la suivante:
la source
S'inscrire
Après iOS 7, ce processus a été simplifié jusqu'à ( swift 3.0 ):
Dequeue
Et plus tard, retiré de la file d'attente en utilisant ( swift 3.0 ):
La différence étant que cette nouvelle méthode non seulement extrait la cellule de la file d'attente, elle crée également si elle est inexistante (cela signifie que vous n'avez pas à faire de
if (cell == nil)
manigances) et que la cellule est prête à être utilisée comme dans l'exemple ci-dessus.Et bien sûr, le type de la classe associée de la cellule est celui que vous avez défini dans le fichier .xib pour la
UITableViewCell
sous - classe, ou bien en utilisant l'autre méthode de registre.Configuration
Idéalement, vos cellules ont déjà été configurées en termes d'apparence et de positionnement de contenu (comme les étiquettes et les vues d'images) au moment où vous les avez enregistrées, et selon la
cellForRowAtIndexPath
méthode que vous remplissez simplement.Tous ensemble
Et bien sûr, tout cela est disponible dans ObjC avec les mêmes noms.
la source
[self.tableView registerNib:[UINib nibWithNibName:@"BlaBlaTableViewCell" bundle:nil] forCellReuseIdentifier:kCellIdentifier];
A pris la réponse de Shawn Craver et l'a nettoyée un peu.
BBCell.h:
BBCell.m:
Je crée toutes les sous-classes de BBCell de UITableViewCell, puis je remplace la norme
avec:
la source
J'ai utilisé la méthode n ° 2 de bentford :
Cela fonctionne, mais faites attention aux connexions au propriétaire du fichier dans votre fichier UITableViewCell .xib personnalisé.
En transmettant
owner:self
votreloadNibNamed
déclaration, vous définissez le enUITableViewController
tant que propriétaire du fichier de votreUITableViewCell
.Si vous faites un glisser-déposer vers le fichier d'en-tête dans IB pour configurer des actions et des sorties, il les définira par défaut comme propriétaire du fichier.
Dans
loadNibNamed:owner:options
, le code d'Apple tentera de définir des propriétés sur votreUITableViewController
, puisque c'est le propriétaire. Mais vous n'avez pas défini ces propriétés, vous obtenez donc une erreur sur la conformité au codage des valeurs de clé :Si un événement est déclenché à la place, vous obtiendrez une NSInvalidArgumentException:
Une solution de contournement simple consiste à pointer vos connexions Interface Builder au
UITableViewCell
lieu du propriétaire du fichier:la source
J'ai décidé de poster car je n'aime aucune de ces réponses - les choses peuvent toujours être plus simples et c'est de loin la manière la plus concise que j'ai trouvée.
1. Construisez votre Xib dans Interface Builder comme vous l'aimez
2. Dans votre sous-classe UIViewController ou UITableViewController
3. Dans votre MyTableViewCellSubclass
la source
Si vous utilisez Interface Builder pour créer des cellules, vérifiez que vous avez défini l'identifiant dans l'inspecteur. Vérifiez ensuite que c'est la même chose lorsque vous appelez dequeueReusableCellWithIdentifier.
J'ai accidentellement oublié de définir des identifiants dans un projet à table lourde, et le changement de performance était comme le jour et la nuit.
la source
Le chargement des UITableViewCells à partir des XIB économise beaucoup de code, mais entraîne généralement une vitesse de défilement horrible (en fait, ce n'est pas le XIB mais l'utilisation excessive des UIViews qui en est la cause).
Je vous suggère de jeter un œil à ceci: Référence du lien
la source
Voici la méthode de classe que j'ai utilisée pour créer des cellules personnalisées à partir de XIB:
Ensuite, dans le XIB, j'ai défini le nom de classe et l'identifiant de réutilisation. Après cela, je peux simplement appeler cette méthode dans mon contrôleur de vue au lieu de
Il est assez rapide et utilisé dans deux de mes applications d'expédition. C'est plus fiable que d'appeler
[nib objectAtIndex:0]
, et dans mon esprit au moins, plus fiable que l'exemple de Stephan Burlot parce que vous êtes assuré de ne saisir qu'une vue d'un XIB qui est le bon type.la source
La bonne solution est la suivante
la source
Le rechargement de la NIB coûte cher. Mieux vaut le charger une fois, puis instancier les objets lorsque vous avez besoin d'une cellule. Notez que vous pouvez ajouter UIImageViews, etc. à la pointe, même plusieurs cellules, en utilisant cette méthode (Apple "registerNIB" iOS5 autorise un seul objet de niveau supérieur - Bogue 10580062 "iOS5 tableView registerNib: trop restrictif"
Donc, mon code est ci-dessous - vous lisez une fois dans la NIB (en initialisant comme je l'ai fait ou dans viewDidload - peu importe. À partir de là, vous instanciez la nib en objets puis choisissez celui dont vous avez besoin. C'est beaucoup plus efficace que de charger la nib encore et encore.
la source
Vérifiez ceci - http://eppz.eu/blog/custom-uitableview-cell/ - moyen très pratique en utilisant une petite classe qui termine une ligne dans la mise en œuvre du contrôleur:
la source
La façon correcte de le faire est de créer une implémentation, un en-tête et un XIB de sous-classe UITableViewCell. Dans le XIB, supprimez toutes les vues et ajoutez simplement une cellule de tableau. Définissez la classe comme nom de la sous-classe UITableViewCell. Pour le propriétaire du fichier, définissez-le comme nom de classe de sous-classe UITableViewController. Connectez le propriétaire du fichier à la cellule à l'aide de la sortie tableViewCell.
Dans le fichier d'en-tête:
Dans le fichier d'implémentation:
la source
Ce que je fais pour cela, c'est déclarer un
IBOutlet UITableViewCell *cell
dans votre classe de contrôleur. Ensuite, appelez laNSBundle loadNibNamed
méthode de classe, qui alimenteraUITableViewCell
la cellule déclarée ci-dessus.Pour le xib, je vais créer un xib vide et ajouter l'
UITableViewCell
objet dans IB où il peut être configuré selon les besoins. Cette vue est ensuite connectée à la celluleIBOutlet
de la classe de contrôleur.Ajouts NSBundle loadNibNamed (connexion ADC)
article de cocoawithlove.com dont je me suis procuré le concept (obtenez l'exemple d'application des numéros de téléphone)
la source
Créez votre propre
AbcViewCell
sous- classe de classe personnalisée à partir deUITableViewCell
(assurez-vous que le nom de votre fichier de classe et le nom du fichier nib sont identiques)Créez cette méthode de classe d'extension.
Utilise le.
let cell: AbcViewCell = UITableViewCell.fromNib()
la source
Importez d'abord votre fichier de cellule personnalisé
#import "CustomCell.h"
, puis modifiez la méthode déléguée comme indiqué ci-dessous:la source
Dans Swift 4.2 et Xcode 10
J'ai trois fichiers de cellules XIB
dans ViewDidLoad enregistrez vos fichiers XIB comme ceci ...
Ceci est la première approche
La deuxième approche enregistre directement les fichiers XIB dans cellForRowAt indexPath:
Voici mes fonctions de délégué tableview
la source
Voici ma méthode pour cela: Chargement personnalisé UITableViewCells de fichiers ... XIB Une autre méthode
L'idée est de créer une sous-classe SampleCell du
UITableViewCell
avec uneIBOutlet UIView *content
propriété et une propriété pour chaque sous-vue personnalisée que vous devez configurer à partir du code. Puis pour créer un fichier SampleCell.xib. Dans ce fichier nib, changez le propriétaire du fichier en SampleCell. Ajoutez un contenuUIView
adapté à vos besoins. Ajoutez et configurez toutes les sous-vues (étiquette, vues d'image, boutons, etc.) que vous souhaitez. Enfin, liez la vue du contenu et les sous-vues au propriétaire du fichier.la source
Voici une approche universelle pour l'enregistrement des cellules dans
UITableView
:Explication:
Reusable
Le protocole génère l'ID de cellule à partir de son nom de classe. Assurez-vous de suivre la convention:cell ID == class name == nib name
.UITableViewCell
conforme auReusable
protocole.UITableView
l'extension résume la différence d'enregistrement des cellules via nib ou classe.Exemple d'utilisation:
la source
Je ne sais pas s'il existe une méthode canonique, mais voici ma méthode:
Et utilisez ce code:
Dans votre exemple, en utilisant
peut se casser si Apple change l'ordre des éléments dans le xib.
la source
la source
Cette extension nécessite Xcode7 beta6
Créez un fichier Xib qui contient seulement 1 UITableViewCell personnalisé.
Charge le.
la source
la source