我提前道歉,但我最终试图解决这个问题。到目前为止,我已经广泛使用了基于单元格的表格,并且从未遇到过这种基于视图的类型的问题。
我有一个带有托管对象列表的数组控制器。它们绑定到表的内容,对象的名称绑定到表的单元格视图(使用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;
我可以看到“result”不是nil,并且从数组返回的值不是nil。然而,只要执行result.textField.stringValue行,我就会得到“EXC_BAD_INSTRUCTION”。如果我使用视图控制器作为dataSource,它似乎没有任何区别。任何想法,将不胜感激。谢谢。
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)
我查看了Apple的TableViewPlayground代码并注意到该行类似于......
NSTableCellView * result = [tableView makeViewWithIdentifier:@&#34; MyView&#34;所有者:自];
不同之处在于他们发送的所有者对象是零......
NSTableCellView * result = [tableView makeViewWithIdentifier:@&#34; MyView&#34;所有者:无];
在我的代码中进行调整就完全不同了。但是,这一点的全部意义在于允许用户直接编辑单元格中的数据。由于所有者现在是nil(NSObject),我的控制器不再是目标,并且没有调用编辑textField后的操作。我记得读过Apple的文档......
注意:调用makeViewWithIdentifier:owner:会导致在应用中多次调用awakeFromNib。这是因为makeViewWithIdentifier:owner:使用传入的所有者加载NIB,并且所有者也会收到一个awakeFromNib调用,即使它已经处于唤醒状态。
我在awakeFromNib方法中修改了我的代码,所以它只被调用一次并且犹豫地改回了makeViewWithIdentifier:to#34; owner&#34;而不是&#34; nil&#34;。那很有效!这是我崩溃的原因。
感谢所有发送回复的人并帮我解决了这个问题。我很感激。