0

アプリケーションにはさまざまなセクションがあります。ボタンでビューを変更してもらいたい。したがって、最初のボタンをクリックすると、ウィンドウのビューが別のビューに変わります。とにかくこれを行うことはありますか?

4

2 に答える 2

2

更新:このコードを使用するサンプルプロジェクト:

SwitchView.zip

ここに画像の説明を入力してください

次のカテゴリを使用して、NSWindowあるビューから別のビューへの切り替えを実装できます。

MDAppKitAdditions.h:

@interface NSWindow (MDAdditions)
- (CGFloat)toolbarHeight;
- (void)resizeToSize:(NSSize)newSize;
- (void)switchView:(NSView *)aView title:(NSString *)aString;
- (void)switchView:(NSView *)aView;
@end

MDAppKitAdditions.m:

static NSView *blankView() {
    static NSView *view = nil;
    if (view == nil) view = [[NSView alloc] init];
    return view;
}

@implementation NSWindow (MDAdditions)

- (CGFloat)toolbarHeight {
    NSToolbar *toolbar = self.toolbar;
    CGFloat toolbarHeight = 0.0;
    if (toolbar && toolbar.isVisible) {
        NSRect windowFrame = [[self class] contentRectForFrameRect:self.frame
                                                     styleMask:self.styleMask];
        toolbarHeight = NSHeight(windowFrame) - NSHeight([self.contentView frame]);
    }
    return toolbarHeight;
}

- (void)resizeToSize:(NSSize)newSize {
    CGFloat newHeight = newSize.height + [self toolbarHeight];
    CGFloat newWidth = newSize.width;
    NSRect aFrame = [[self class] contentRectForFrameRect:self.frame
                                                styleMask:self.styleMask];
    aFrame.origin.y += aFrame.size.height;
    aFrame.origin.y -= newHeight;
    aFrame.size.height = newHeight;
    aFrame.size.width = newWidth;
    aFrame = [[self class] frameRectForContentRect:aFrame
                                         styleMask:self.styleMask];
    [self setFrame:aFrame display:YES animate:YES];
}

- (void)switchView:(NSView *)aView title:(NSString *)aTitle {
    if (self.contentView != aView) {
        [self setContentView:blankView()];
        if (aTitle) [self setTitle:NSLocalizedString(aTitle, @"")];
        [self resizeToSize:aView.frame.size];
        [self setContentView:aView];
    }
}

- (void)switchView:(NSView *)aView {
    return [self switchView:aView title:nil];
}

@end

これを使用するには、ビューとメインウィンドウ用のIBOutletsを備えた次のようなコントローラークラスがあると思います。

@interface MDAppController : NSObject {
    IBOutlet NSWindow  *mainWindow;
    IBOutlet NSView    *firstView;
    IBOutlet NSView    *secondView;
}

- (IBAction)changeView:(id)sender;

@end

次に、実装では、次のようになります。

#import "MDAppKitAdditions.h"

@implementation MDAppController

- (IBAction)changeView:(id)sender {
    NSInteger tag = [sender tag];
    NSView *targetView = nil;

    if (tag == 0) {
       targetView = firstView;
    else if (tag == 1) {
       targetView = secondView;
    }
    [mainWindow switchView:targetView title:@"New window title"];
}

@end

changeView:ビューを切り替えるために使用するボタンが、それぞれに個別のメソッドを定義するのではなく、それぞれ同じメソッドを呼び出すように設定できます。Interface Builderのnibファイルで、ボタンのタグプロパティを設定してボタンを区別することができます。実行時にボタンをクリックしてchangeView:メソッドを呼び出すと、ボタンがジェネリックsenderパラメーターとして渡されるため、それを調べて、どのビューに切り替えるかを決定します。

于 2013-02-04T03:59:47.867 に答える
2

NSTabViewを使用します。タブビューをフチなしにして、ベゼルやタブが描画されないようにし(を使用して)、または[tabView setTabViewType:NSNoTabsNoBorder]を使用してアクティブなタブを切り替えることにより、プログラムでビューを変更する独自のボタンアクションを実装できます。これには、InterfaceBuilderですべてのビューを構成できるという追加の利点があります。-selectTabViewItem:-selectTabViewItemAtIndex:

于 2013-02-04T05:28:37.263 に答える