Как создать NSPopover программно

я не нашел несколько примеров динамического создания NSPopover вместо использования Interface Builder.

Следующий код дает исключение, загруженный наконечник, но представление не установлено:

NSViewController *controller = [[NSViewController alloc] initWithNibName:@"View"     bundle:nil];
NSPopover *popover = [[NSPopover alloc] init];
[popover setContentSize:NSMakeSize(100.0f, 100.0f)];
[popover setContentViewController:controller];
[popover setAnimates:YES];
[popover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
[popover release];
[controller release];

Вот трассировка стека:

2011-10-22 12:00:16.804 Test[2020:707] -[NSViewController loadView] loaded the "View" nib    but no view was set.
2011-10-22 12:00:16.807 Test[2020:707] (
0   CoreFoundation                      0x00007fff87e10286 __exceptionPreprocess + 198
1   libobjc.A.dylib                     0x00007fff92f2cd5e objc_exception_throw + 43
2   CoreFoundation                      0x00007fff87e100ba +[NSException   raise:format:arguments:] + 106
3   CoreFoundation                      0x00007fff87e10044 +[NSException raise:format:] + 116
4   AppKit                              0x00007fff90951e21 -[NSViewController loadView] + 336
5   AppKit                              0x00007fff9094da8a -[NSViewController view] + 41
6   AppKit                              0x00007fff91065232 -[NSPopover showRelativeToRect:ofView:preferredEdge:] + 159
7   Test                                0x000000010000159a -[OITAppDelegate show:] + 570
8   CoreFoundation                      0x00007fff87dffa1d -[NSObject performSelector:withObject:] + 61
9   AppKit                              0x00007fff90924710 -[NSApplication sendAction:to:from:] + 139
10  AppKit                              0x00007fff90924642 -[NSControl sendAction:to:] + 88
11  AppKit                              0x00007fff9092456d -[NSCell _sendActionFrom:] + 137
12  AppKit                              0x00007fff90923a30 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2014
13  AppKit                              0x00007fff909a38e0 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 489
14  AppKit                              0x00007fff9092263a -[NSControl mouseDown:] + 786
15  AppKit                              0x00007fff908ed0e0 -[NSWindow sendEvent:] + 6306
16  AppKit                              0x00007fff9088568f -[NSApplication sendEvent:] + 5593
17  AppKit                              0x00007fff9081b682 -[NSApplication run] + 555
18  AppKit                              0x00007fff90a9a80c NSApplicationMain + 867
19  Test                                0x00000001000012f2 main + 34
20  Test                                0x00000001000012c4 start + 52
21  ???                                 0x0000000000000003 0x0 + 3

person martin    schedule 22.10.2011    source источник


Ответы (1)


Проблема не в NSPopover; исключение выдается NSViewController, и в нем говорится, что хотя загрузка пера прошла успешно, его свойство view по-прежнему равно nil.

Откройте «View.nib» в Interface Builder и назначьте выход view владельца файла объекту представления, который должен представлять контроллер (NSViewContoller становится владельцем файла при загрузке пера). Это делается путем перетаскивания с нажатой клавишей Ctrl от значка владельца файла к значку представления, а затем выбора view из списка выходов.

person hamstergene    schedule 22.10.2011
comment
Спасибо за хороший ответ на этот старый вопрос. Связанный с этим вопрос: как вы узнали, что это исключение связано с невозможностью назначить выход view, а не с чем-то другим, например, неспособностью назначить выход contentViewController всплывающего окна ? - person Mark Bernstein; 15.06.2013
comment
@MarkBernstein Это исключение с этим текстом сообщения возникает только в том случае, если при загрузке не было присвоено свойство view. - person hamstergene; 15.06.2013