我的应用程序有不同的部分。我想让按钮改变视图。因此,如果我单击第一个按钮,Windows 的视图将更改为另一个视图。有没有办法做到这一点?
问问题
792 次
2 回答
2
更新:使用此代码的示例项目:
您可以使用以下类别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 回答