NSTableView ViewBased崩溃

时间:2017-10-04 02:43:15

标签: objective-c macos nstableview

我提前道歉,但我最终试图解决这个问题。到目前为止,我已经广泛使用了基于单元格的表格,并且从未遇到过这种基于视图的类型的问题。

我有一个带有托管对象列表的数组控制器。它们绑定到表的内容,对象的名称绑定到表的单元格视图(使用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  

1 个答案:

答案 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;。那很有效!这是我崩溃的原因。

感谢所有发送回复的人并帮我解决了这个问题。我很感激。