2017-10-04 3 views
-1

私は前もってお詫びしますが、私はこれを理解しようとしています。私は今までセルベースのテーブルをかなり広く使用してきましたが、このビューベースのタイプでは何の問題もなかったことはありません。NSTableView ViewBasedクラッシュ

私は管理対象オブジェクトのリストを持つアレイコントローラを持っています。それらはテーブルの内容にバインドされ、オブジェクトの名前は(objectValue.nameを使用して)テーブルのセルビューにバインドされます。

アレイコントローラのオブジェクトを保持するローカルアレイがあります。それは保持されます。

テーブルのデリゲートをビューコントローラに設定しました。 Appleのドキュメントで説明されている@ "MyView"識別子を設定しました。

これは私が問題を抱えているこれでコードが...

- (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; 

私は「結果」がnilでないと、配列から返された値がnilではないことがわかります。それでも、result.textField.stringValue行が実行されると、私は "EXC_BAD_INSTRUCTION"を取得します。私がデータソースとしてビューコントローラを使用するかどうかにかかわらず、何の違いもないようです。任意のアイデアをいただければ幸いです。ありがとうございました。

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

テーブルの列は1つだけですか? –

+0

クラッシュのスタックトレースを表示します。実際には、完全なクラッシュレポートを表示するのが最善の方法です。 –

+1

**明示的にKVCが必要な理由を説明できない限り、 'valueForKey'を使用して辞書から単一の値を取得することは絶対に避けてください。専用のシンタックスは 'objectForKey'またはキーサブスクリプションです。' localArray [row] [@ "name"] ' – vadian

答えて

0

私はAppleのTableViewPlaygroundコードを見て気づいたものと同様のライン...

NSTableCellView *結果= [のtableView makeViewWithIdentifier:@ "MYVIEW" 所有者:自己];

は...

NSTableCellView *結果= [のtableView makeViewWithIdentifier:@ "MYVIEW" 所有者:nilを]彼らは送信され、所有者オブジェクトがnilだったという点で異なっていました。

私のコードでこの調整を行うことで、すべての違いが生じました。しかし、この全体のポイントは、ユーザーがセル内のデータを直接編集できるようにすることでした。所有者が現在nil(NSObject)になっているので、コントローラはターゲットではなくなり、textFieldを編集した後のアクションは呼び出されませんでした。私はアップル社のドキュメントで読むことを覚えています...

注:makeViewWithIdentifier:ownerを呼び出すと、あなたのアプリでawakeFromNibが複数回呼び出されます。これは、makeViewWithIdentifier:owner:が渡された所有者と一緒にNIBをロードし、awakeFromNib呼び出しが既に起きているにもかかわらず、所有者がそれを受け取るためです。

私はawakeFromNibメソッドでコードを変更したので、一度だけ呼び出され、makeViewWithIdentifierを "nil"ではなく "owner"に戻しました。それはうまくいった!それが私の墜落の元の原因でした。

回答を送ってくれた皆さん、ありがとうございました。それは有り難いです。

関連する問題