0

我的应用程序有不同的部分。我想让按钮改变视图。因此,如果我单击第一个按钮,Windows 的视图将更改为另一个视图。有没有办法做到这一点?

4

2 回答 2

2

更新:使用此代码的示例项目:

切换视图.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 文件中,您可以设置按钮的 tag 属性以区分它们。在运行时,当您单击按钮并调用该changeView:方法时,该按钮将作为通用sender参数传入,因此您可以检查它以确定您应该切换到哪个视图。

于 2013-02-04T03:59:47.867 回答
2

使用NSTabView。您可以使选项卡视图无边框,以便不绘制边框或选项卡(使用[tabView setTabViewType:NSNoTabsNoBorder]),然后实现您自己的按钮操作,通过使用-selectTabViewItem:或切换活动选项卡以编程方式更改视图-selectTabViewItemAtIndex:。这具有额外的好处,即能够在 Interface Builder 中配置所有视图。

于 2013-02-04T05:28:37.263 回答