324 votes

Échec de l'assertion dans dequeueReusableCellWithIdentifier:forIndexPath :

Je faisais un lecteur rss pour mon école et j'ai fini le code. J'ai lancé le test et il m'a donné cette erreur. Voici le code auquel il se réfère :

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                     forIndexPath:indexPath];
    if (cell == nil) {

        cell = 
         [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  
                                reuseIdentifier:CellIdentifier];

    }

Voici l'erreur dans la sortie :

2012-10-04 20:13:05.356 Lecteur [4390:c07] * Échec d'assertion dans -[UITableView dequeueReusableCellWithIdentifier:forIndexPath :], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04 20:13:05.357 Reader [4390:c07] * Arrêt de l'application en raison d'une exception exception 'NSInternalInconsistencyException', reason : 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'. pour l'identifiant ou connecter une cellule prototype dans un storyboard'. * Pile du premier appel lancé : (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935) libc++abi.dylib : terminate appelé en lançant une exception

et voici le code qu'il affiche dans l'écran d'erreur :

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Aidez-nous !

0 votes

19voto

Brian Shriver Points 242

Je vais juste ajouter que Xcode 4.5 comprend le nouveau dequeueReusableCellWithIdentifier:forIndexPath:
dans son code de modèle par défaut - un piège potentiel pour les développeurs qui s'attendaient à ce que l'ancienne version de l'application dequeueReusableCellWithIdentifier: méthode.

0 votes

Ça m'a piqué ! Maintenant, j'en saurai plus. ;)

18voto

Steven Points 1637

Dans votre storyboard, vous devez définir l'identifiant de votre prototype de cellule comme étant le même que celui de votre CellReuseIdentifier "Cell". Ainsi, vous n'obtiendrez pas ce message et vous n'aurez pas besoin d'appeler la fonction registerClass :.

18voto

Dan Beaulieu Points 12489

Solution Swift 2.0 :

Vous devez aller dans votre inspecteur d'attributs et ajouter un nom à votre identificateur de cellule :

enter image description here

Ensuite, vous devez faire correspondre votre identifiant avec votre dequeue comme ceci :

let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell

Ou bien

Si vous travaillez avec une plume, vous devrez peut-être enregistrer votre classe dans votre cellForRowAtIndexPath :

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {       

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")

    // included for context            
    let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell

    //... continue    
}

La référence de la classe UITableView d'Apple dit :

Avant de retirer des cellules de la file d'attente, appelez cette méthode ou la méthode registerNib:forCellReuseIdentifier : pour indiquer à la vue du tableau la façon dont les cellules peuvent être mises en file d'attente. comment créer de nouvelles cellules. Si une cellule du type spécifié ne se trouve pas actuellement dans une file d'attente de réutilisation, la vue tableau utilise les informations fournies pour créer automatiquement un nouvel objet cellule.

Si vous avez précédemment enregistré une classe ou un fichier nib avec le même identificateur de réutilisation, la classe que vous spécifiez peut être utilisée. identifiant de réutilisation, la classe que vous spécifiez dans le paramètre cellClass remplace l'ancienne entrée. Vous pouvez spécifier nil pour cellClass si vous voulez désenregistrer la classe de l'identificateur de réutilisation spécifié.

Voici le code du cadre Swift 2.0 d'Apple :

// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.

@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)

@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

3voto

Si vous optez pour Cellules statiques personnalisées commentez simplement cette méthode :

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    static NSString *CellIdentifier = @"notificationCell";
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//    return cell;
//}

et donner aux cellules un identifiant à "Inspecteur des attributs" dans le storyboard.

3voto

user3182143 Points 1

Je vous donne la réponse à la fois en Objective C et en Swift. Avant cela, je voudrais dire

Si nous utilisons le dequeueReusableCellWithIdentifier:forIndexPath: nous devons enregistrer une classe ou un fichier nib à l'aide de la méthode registerNib:forCellReuseIdentifier : ou registerClass:forCellReuseIdentifier : avant d'appeler cette méthode en tant que Apple Documnetation dit

Nous ajoutons donc registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:

Une fois que nous avons enregistré une classe pour l'identifiant spécifié et qu'une nouvelle cellule doit être créée, cette méthode initialise la cellule en appelant sa méthode initWithStyle:reuseIdentifier :. Pour les cellules basées sur nib, cette méthode charge l'objet cellule à partir du fichier nib fourni. Si une cellule existante était disponible pour la réutilisation, cette méthode appelle la méthode prepareForReuse de la cellule à la place.

dans la méthode viewDidLoad nous devons enregistrer la cellule

Objectif C

OPTION 1 :

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

OPTION 2 :

[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];

dans le code ci-dessus nibWithNibName:@"CustomCell" donnez le nom de votre plume au lieu du nom de ma plume CustomCell

SWIFT

OPTION 1 :

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

OPTION 2 :

tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 

dans le code ci-dessus nibName:"NameInput" donnez un nom à votre plume

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X