Как внедрить NSStackView в иерархию представлений?
У меня есть приложение OSX, написанное на Objective-C. Отображает некоторые NSView
в NSWindow
Проблема в том, что я не могу изменить его код. Исходная иерархия моделей выглядит следующим образом:
NSWindow
|---> original NSView
|---> (...)
Я хотел бы изменить иерархию следующим образом:
NSWindow
|---> NSStackView
|---> original NSView
| |---> (...)
|---> some additional NSView (say NSTextField)
Как я могу отобразить как оригинал NSView
и дополнительный NSView
рядом друг с другом, используя NSStackView
?
Мой нынешний подход был более или менее таким (пример упрощен):
- (void)createFirstView {
NSTextField *label1 = [NSTextField labelWithString:@"First view."];
[_window setContentView: label1];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// I cannot modify this procedure:
[self createFirstView];
// I can modify that:
NSTextField *label2 = [NSTextField labelWithString:@"Second view."];
NSView *firstView = [_window contentView];
[firstView removeFromSuperview];
NSStackView *st = [NSStackView stackViewWithViews:@[firstView, label2]];
[_window setContentView:st];
}
К сожалению NSWindow
после запуска этот код показывает только метку "Второе представление":
1 ответ
[_window setContentView:st]
звонки removeFromSuperview
на старом просмотре контента и removeFromSuperview
освобождает представление. [firstView removeFromSuperview]
а также [_window setContentView:st]
оба выпустят firstView
,
Решение: заменить [firstView removeFromSuperview]
от [_window setContentView:nil]
,
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// I cannot modify this procedure:
[self createFirstView];
// I can modify that:
NSTextField *label2 = [NSTextField labelWithString:@"Second view."];
NSView *firstView = [_window contentView];
[_window setContentView:nil];
NSStackView *st = [NSStackView stackViewWithViews:@[firstView, label2]];
[_window setContentView:st];
}