アプリケーションにはさまざまなセクションがあります。ボタンでビューを変更してもらいたい。したがって、最初のボタンをクリックすると、ウィンドウのビューが別のビューに変わります。とにかくこれを行うことはありますか?
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ファイルで、ボタンのタグプロパティを設定してボタンを区別することができます。実行時にボタンをクリックしてchangeView:
メソッドを呼び出すと、ボタンがジェネリックsender
パラメーターとして渡されるため、それを調べて、どのビューに切り替えるかを決定します。
NSTabViewを使用します。タブビューをフチなしにして、ベゼルやタブが描画されないようにし(を使用して)、または[tabView setTabViewType:NSNoTabsNoBorder]
を使用してアクティブなタブを切り替えることにより、プログラムでビューを変更する独自のボタンアクションを実装できます。これには、InterfaceBuilderですべてのビューを構成できるという追加の利点があります。-selectTabViewItem:
-selectTabViewItemAtIndex: