可能不会在事务提交中调用NSAlert runModal(通常这意味着它是在视图中调用的-drawRect:方法)

时间:2017-02-17 17:16:06

标签: macos xamarin xamarin.mac

我有一个Xamarin.Mac应用程序在尝试显示来自NSOutlineViewDelegate的GetView方法的警报时崩溃。

代码如下:

internal class ItemsDelegate : NSOutlineViewDelegate
{
    public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
    {
        try
        {
            //code to return the NSView
        }
        catch (Exception ex)
        {

            NSAlert alert = new NSAlert();
            alert.InformativeText = message;

            alert.RunModal();
        }
    }

}

因此,它发生的是在代码中抛出一个受控异常以返回NSView。 当试图用NSAlert显示它时,在catch块和" alert.RunModal()"执行时,应用程序崩溃。

崩溃异常如下:

Terminating app due to uncaught exception 'NSGenericException', reason: '-[NSAlert runModal] may not be invoked inside of transaction commit (usually this means it was invoked inside of a view's -drawRect: method.)'

First throw call stack:
(
    0   CoreFoundation                      0x00007fffca9976fb _exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00007fffdf33ba2a objc_exception_throw + 48
    2   CoreFoundation                      0x00007fffcaa149a5 +[NSException raise:format:] + 197
    3   AppKit                              0x00007fffc8d2eeaa _NSRunModal + 266
    4   AppKit                              0x00007fffc876c591 -[NSAlert runModal] + 270
    5   macplastic                          0x0000000107c97b39 xamarin_dyn_objc_msgSend + 217
    6   ???                                 0x0000000116c14f2b 0x0 + 4676734763
    7   ???                                 0x0000000116b06825 0x0 + 4675627045
    8   ???                                 0x0000000116a62808 0x0 + 4674955272
    9   ???                                 0x0000000116a62b8e 0x0 + 4674956174
    10  macplastic                          0x0000000107d9a340 mono_jit_runtime_invoke + 2272
    11  macplastic                          0x0000000107e4b3c8 do_runtime_invoke + 88
    12  macplastic                          0x0000000107e4b2d6 mono_runtime_invoke + 102
    13  macplastic                          0x0000000107c9583d xamarin_invoke_trampoline + 5725
    14  macplastic                          0x0000000107c965bd xamarin_arch_trampoline + 189
    15  macplastic                          0x0000000107c979b1 xamarin_x86_64_common_trampoline + 110
    16  AppKit                              0x00007fffc85b4f84 -[NSTableView(NSTableViewViewBased) makeViewForTableColumn:row:] + 76
    17  AppKit                              0x00007fffc85b495b -[NSTableRowData _addViewToRowView:atColumn:row:] + 308
    18  AppKit                              0x00007fffc85b469f -[NSTableRowData _addViewsToRowView:atRow:] + 204
    19  AppKit                              0x00007fffc85b2e47 -[NSTableRowData _initializeRowView:atRow:] + 390
    20  AppKit                              0x00007fffc85b144d -[NSTableRowData _addRowViewForVisibleRow:withPriorView:] + 398
    21  AppKit                              0x00007fffc85b1208 -[NSTableRowData _addRowViewForVisibleRow:withPriorRowIndex:inDictionary:withRowAnimation:] + 316
    22  AppKit                              0x00007fffc85b0030 -[NSTableRowData _unsafeUpdateVisibleRowEntries] + 1647
    23  AppKit                              0x00007fffc85af923 -[NSTableRowData updateVisibleRowViews] + 232
    24  AppKit                              0x00007fffc85af27a -[NSTableView layout] + 178
    25  AppKit                              0x00007fffc8d19afc _NSViewLayout + 450
    26  AppKit                              0x00007fffc8550074 -[NSView _doLayout] + 126
    27  AppKit                              0x00007fffc854fbf9 -[NSView _layoutSubtreeWithOldSize:] + 497
    28  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    29  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    30  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    31  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    32  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    33  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    34  AppKit                              0x00007fffc854fec7 -[NSView _layoutSubtreeWithOldSize:] + 1215
    35  AppKit                              0x00007fffc8d1fe89 -[NSView _layoutSubtreeIfNeededAndAllowTemporaryEngine:] + 1517
    36  AppKit                              0x00007fffc856e3f1 -[NSWindow(NSConstraintBasedLayout) _layoutViewTree] + 163
    37  AppKit                              0x00007fffc85dd52a -[NSWindow(NSConstraintBasedLayout) layoutIfNeeded] + 269
    38  AppKit                              0x00007fffc8d49f78 _NSWindowGetDisplayCycleObserver_block_invoke.6213 + 67
    39  AppKit                              0x00007fffc85eec89 _37+[NSDisplayCycle currentDisplayCycle]_block_invoke + 454
    40  QuartzCore                          0x00007fffd045a1ba _ZN2CA11Transaction19run_commit_handlersE18CATransactionPhase + 46
    41  QuartzCore                          0x00007fffd0561e10 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 160
    42  QuartzCore                          0x00007fffd0458d55 _ZN2CA11Transaction6commitEv + 475
    43  AppKit                              0x00007fffc88d0d99 _37+[NSDisplayCycle currentDisplayCycle]_block_invoke.31 + 323
    44  CoreFoundation                      0x00007fffca92dec7 _CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    45  CoreFoundation                      0x00007fffca92de37 _CFRunLoopDoObservers + 391
    46  CoreFoundation                      0x00007fffca90ed79 _CFRunLoopRun + 873
    47  CoreFoundation                      0x00007fffca90e7b4 CFRunLoopRunSpecific + 420
    48  HIToolbox                           0x00007fffc9e9e2ac RunCurrentEventLoopInMode + 240
    49  HIToolbox                           0x00007fffc9e9e0e1 ReceiveNextEventCommon + 432
    50  HIToolbox                           0x00007fffc9e9df16 _BlockUntilNextEventMatchingListInModeWithFilter + 71
    51  AppKit                              0x00007fffc84a06cd _DPSNextEvent + 1093
    52  AppKit                              0x00007fffc8c17830 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 2730
    53  AppKit                              0x00007fffc849506d -[NSApplication run] + 926
    54  AppKit                              0x00007fffc845f983 NSApplicationMain + 1237
    55  ???                                 0x000000010c7cc9d2 0x0 + 4504472018
    56  ???                                 0x000000010c7cc5cd 0x0 + 4504470989
    57  macplastic                          0x0000000107d9a340 mono_jit_runtime_invoke + 2272
    58  macplastic                          0x0000000107e4b3c8 do_runtime_invoke + 88
    59  macplastic                          0x0000000107e4d8a0 mono_runtime_exec_main + 896
    60  macplastic                          0x0000000107e4d45d mono_runtime_run_main + 909
    61  macplastic                          0x0000000107cefca7 mono_jit_exec + 247
    62  macplastic                          0x0000000107cf2022 mono_main + 8098
    63  macplastic                          0x0000000107c982c4 xamarin_main + 980
    64  macplastic                          0x0000000107c98fd4 main + 36
    65  macplastic                          0x0000000107c7f944 start + 52
    66  ???                                 0x0000000000000002 0x0 + 2
)
libc++abi.dylib: terminating with uncaught exception of type NSException

任何帮助?

另外,为什么即使添加try / catch块,应用程序也会崩溃?有没有办法避免崩溃?

        try
        {
            NSAlert alert = new NSAlert();
            alert.InformativeText = message;

            alert.RunModal();
        }
        catch (Exception ex)
        {

         //Nothing to do, we did our best to show the error message, avoid an unhandled crash.
        }

非常感谢任何帮助。

0 个答案:

没有答案