0

NSToolbarとNSWindowControllerを使用して、NSWindowのビューを変更しています。ツールバー項目を選択すると、ウィンドウのビューが正常に変更され、ウィンドウのサイズがビューのサイズに応じて変更されます。ウィンドウを最初にロードすると、ビューのコンテンツが期待どおりに表示されます。ただし、ツールバーアイテムを選択すると、新しいビューのコンテンツは表示されなくなり、ビューを元のビューに戻すと、そのコンテンツも表示されなくなります。何がこれを引き起こしているのかわからないので、助けていただければ幸いです。

#import <Cocoa/Cocoa.h>

@interface WindowController : NSWindowController {
    IBOutlet NSView *firstView;
    IBOutlet NSView *secondView;

    int currentViewTag;
}

- (IBAction)switchView:(id)sender;

@end

#import "WindowController.h"

@interface WindowController ()

@end

@implementation WindowController

- (id)init {
    self = [super initWithWindowNibName:@"WindowController"];
    if (self) {
    }

    return self;
}

- (void)windowDidLoad {
    [super windowDidLoad];
}

- (NSRect)newFrameForNewContentView:(NSView*)view {

    NSWindow *window = [self window];
    NSRect newFrameRect = [window frameRectForContentRect:[view frame]];
    NSRect oldFrameRect = [window frame];
    NSSize newSize = newFrameRect.size;
    NSSize oldSize = oldFrameRect.size;

    NSRect frame = [window frame];
    frame.size = newSize;
    frame.origin.y -= (newSize.height - oldSize.height);

    return frame;
}

- (NSView *)viewForTag:(int)tag {

    NSView *view = nil;
    switch (tag) {
        case 0:
            view = firstView;
            break;
        case 1:
            view = secondView;
            break;
    }

    return  view;
}

- (BOOL)validateToolbarItem:(NSToolbarItem *)item {
    if ([item tag] == currentViewTag) return NO;
    else return YES;
}

- (void)awakeFromNib {

    [[self window] setContentSize:[firstView frame].size];
    [[[self window] contentView] addSubview:firstView];
    [[[self window] contentView] setWantsLayer:YES];
}

- (IBAction)switchView:(id)sender {

    double tag = [sender tag];
    NSView *view = [self viewForTag:tag];
    NSView *previousView = [self viewForTag:currentViewTag];
    currentViewTag = tag;

    NSRect newFrame = [self newFrameForNewContentView:view];


    [NSAnimationContext beginGrouping];

    if ([[NSApp currentEvent] modifierFlags] & NSShiftKeyMask)
        [[NSAnimationContext currentContext] setDuration:1.0];

    [[[[self window] contentView] animator] replaceSubview:previousView with:view];
    [[[self window] animator] setFrame:newFrame display:YES];

    [NSAnimationContext endGrouping];
}

@end
4

1 に答える 1

0

私はあなたのコードを試しました、そして私が見たのはビューが消えたということではなく、それらが間違って配置されてビューの外に移動したということでした。これを修正するには、IBで自動レイアウトをオフにし、サイズインスペクターですべての支柱とばねの選択を解除しました。また、ウィンドウの「復元可能」プロパティの選択を解除して、ビュー2が表示された状態でプログラムを閉じてから再度開いた場合に、ウィンドウ(ビュー1が内側にある)がビュー1の正しいサイズになるようにしました。

于 2012-10-04T04:59:00.957 に答える