Как внедрить NSStackView в иерархию представлений? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть приложение 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 послепри запуске этого кода отображается только метка «Второй вид»:

Result

1 Ответ

0 голосов
/ 27 ноября 2018

[_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];
}
...