2017-10-04 2 views
-1

Je m'excuse d'avance, mais je suis à bout de nerfs en essayant de comprendre cela. J'ai utilisé des tables basées sur des cellules assez largement jusqu'à maintenant et n'ai jamais eu le genre de problèmes que j'ai avec ce type basé sur la vue.NSTableView ViewBased crashs

J'ai un contrôleur RAID avec une liste d'objets gérés. Ils sont liés au contenu de la table et le nom des objets est lié à la vue de la cellule de la table (en utilisant objectValue.name).

Une matrice locale contient les objets du contrôleur de matrice. Il est retenu.

J'ai défini le délégué de la table sur mon contrôleur de vue. J'ai défini l'identifiant @ "MyView" comme expliqué dans les documents d'Apple.

C'est le code avec lequel je suis ... questions ayant

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

NSTableCellView *result = [tableView makeViewWithIdentifier:@"MyView" owner:self]; 

// Set the stringValue of the cell's text field to the nameArray value at row 

result.textField.stringValue = [[localArray objectAtIndex:row] valueForKey:@"name"]; 

return result; 

Je peux voir que « résultat » est non nul et que la valeur renvoyée par le tableau est non nul. Pourtant, dès que la ligne result.textField.stringValue est exécutée, j'obtiens "EXC_BAD_INSTRUCTION". Cela ne semble pas faire de différence si j'utilise le contrôleur de vue en tant que dataSource ou non. Toute idée serait appréciée. Je vous remercie.

0x7fff841f13e1 <+0>: pushq %rbp 
    0x7fff841f13e2 <+1>: movq %rsp, %rbp 
    0x7fff841f13e5 <+4>: pushq %r14 
    0x7fff841f13e7 <+6>: pushq %rbx 
    0x7fff841f13e8 <+7>: movq %rdx, %rbx 
    0x7fff841f13eb <+10>: movq 0x1cfe882e(%rip), %rsi ; "description" 
    0x7fff841f13f2 <+17>: movq 0x1cd17d5f(%rip), %r14 ; (void *)0x00007fff9b66e000: objc_msgSend 
    0x7fff841f13f9 <+24>: movq %rbx, %rdi 
    0x7fff841f13fc <+27>: callq *%r14 
    0x7fff841f13ff <+30>: movq %rax, %rcx 
    0x7fff841f1402 <+33>: leaq 0x1cd65977(%rip), %rdi ; @"Crashing on exception: %@" 
    0x7fff841f1409 <+40>: xorl %eax, %eax 
    0x7fff841f140b <+42>: movq %rcx, %rsi 
    0x7fff841f140e <+45>: callq 0x7fff8401d97b   ; _NSNoteInCrashReports 
    0x7fff841f1413 <+50>: movq 0x1cfea3a6(%rip), %rsi ; "callStackSymbols" 
    0x7fff841f141a <+57>: movq %rbx, %rdi 
    0x7fff841f141d <+60>: callq *%r14 
    0x7fff841f1420 <+63>: movq 0x1cfeb951(%rip), %rsi ; 
"componentsJoinedByString:" 
    0x7fff841f1427 <+70>: leaq 0x1cd61e12(%rip), %rdx ; @"'\n'" 
    0x7fff841f142e <+77>: movq %rax, %rdi 
    0x7fff841f1431 <+80>: callq *0x1cd17d21(%rip)   ; (void *)0x00007fff9b66e000: objc_msgSend 
    0x7fff841f1437 <+86>: movq 0x1cfeaa9a(%rip), %rsi ; "UTF8String" 
    0x7fff841f143e <+93>: movq %rax, %rdi 
    0x7fff841f1441 <+96>: callq *0x1cd17d11(%rip)   ; (void *)0x00007fff9b66e000: objc_msgSend 
    0x7fff841f1447 <+102>: movq %rax, 0x1d05a372(%rip) ; gCRAnnotations + 24 
-> 0x7fff841f144e <+109>: ud2  
    0x7fff841f1450 <+111>: movq %rax, %rdi 
    0x7fff841f1453 <+114>: callq 0x7fff849f0c86   ; symbol stub for: objc_begin_catch 
    0x7fff841f1458 <+119>: xorl %edi, %edi 
    0x7fff841f145a <+121>: xorl %esi, %esi 
    0x7fff841f145c <+123>: xorl %eax, %eax 
    0x7fff841f145e <+125>: callq 0x7fff8401d97b   ; _NSNoteInCrashReports 
    0x7fff841f1463 <+130>: callq 0x7fff849f0caa   ; symbol stub for: objc_exception_rethrow 
    0x7fff841f1468 <+135>: movq %rax, %rbx 
    0x7fff841f146b <+138>: callq 0x7fff849f0c9e   ; symbol stub for: objc_end_catch 
    0x7fff841f1470 <+143>: movq %rbx, %rdi 
    0x7fff841f1473 <+146>: callq 0x7fff849f06d4   ; symbol stub for: _Unwind_Resume 
    0x7fff841f1478 <+151>: callq 0x7fff849f0d58   ; symbol stub for: objc_terminate 
    0x7fff841f147d <+156>: nop  
    0x7fff841f147e <+157>: nop  
    0x7fff841f147f <+158>: nop 
+0

Vous avez seulement une colonne de table? –

+0

Affiche la trace de la pile du plantage. En fait, probablement le meilleur pour montrer le rapport complet d'accident. –

+1

** N'utilisez jamais 'valueForKey' pour obtenir une seule valeur d'un dictionnaire, sauf si vous pouvez expliquer pourquoi vous avez explicitement besoin de KVC. La syntaxe dédiée est 'objectForKey' ou l'abonnement à la clé:' localArray [row] [@ "name"] ' – vadian

Répondre

0

J'ai regardé le code TableViewPlayground d'Apple et a remarqué que la ligne similaire à ...

NSTableCellView * Résultat = [tableView makeViewWithIdentifier: @ "MyView" propriétaire: auto];

était différent en ce que l'objet propriétaire ils ont envoyé était nul ...

NSTableCellView * Résultat = [tableView makeViewWithIdentifier: @ "MyView" propriétaire: nil]; Faire ce réglage dans mon code a fait toute la différence. Cependant, le but était de permettre à l'utilisateur d'éditer directement les données dans les cellules. Le propriétaire étant maintenant nul (NSObject), mon contrôleur n'était plus la cible et l'action après l'édition du textField n'était pas appelée. Je me souviens avoir lu dans les docs d'Apple ...

Note: Appeler makeViewWithIdentifier: owner: provoque que awakeFromNib soit appelé plusieurs fois dans votre application. En effet, makeViewWithIdentifier: owner: charge un NIB avec le propriétaire transmis, et le propriétaire reçoit également un appel awakeFromNib, même s'il est déjà éveillé.

J'ai modifié mon code dans la méthode awakeFromNib de façon à ce qu'il ne soit appelé qu'une seule fois et qu'il ait été modifié avec hésitation en retour makeViewWithIdentifier: en "owner" au lieu de "nil". Ça a marché! C'était la cause initiale de mon accident.

Merci à tous ceux qui ont envoyé des réponses et m'a aidé à comprendre cela. Je vous en suis reconnaissant.