我正在创建一个 OSX 应用程序,它有一个窗口。该窗口包含一个视图,在整个使用过程中呈现不同的视图。
我目前的做法:
在默认的 MainMenu.xib 中,我在默认生成的窗口(这是我将使用的窗口)中为自定义视图创建了一个出口。我们就这样称呼它吧MainView
.
我创建了一个视图控制器,带有一个 xib 文件。在 xib 中,我为其创建了一个视图和一个出口。我们就这样称呼它吧CustomView1
。稍后我将在此视图控制器中拥有多个视图。
In AppDelegate.h
我导入了视图控制器,并将其分配如下:@property (strong, nonatomic) MasterViewController *masterViewController;
In AppDelegate.m
in applicationDidFinishLaunching
我尝试显示自定义视图:_MainView = _masterViewController.CustomView1;
目前这会导致一个空窗口。我怀疑我以错误的方式处理这件事。做这个的最好方式是什么?
您的错误是您最初没有显示您的第一个视图。这是我学习如何在窗口中交换视图的方法。这是否是最好的方法,不取决于我。您的方法的不同之处在于您应该将视图与窗口分离。可能还有更好的方法,但官方教授的是以下方法。
使用 mainmenu.xib 作为窗口控制器。在窗口中拖放一个框并将框边框设置为“无”。您将有一个看不见的盒子,它将成为您的视图的容器。
创建任意数量的视图控制器以获得不同的视图。当然,这是通过创建一个新类作为 NSViewController 的子类来实现的。在你的主类(可能是 appDelegate,但也可以是其他类)中,你至少创建一个 NSBox 的 IBOutlet(你在主窗口中放置的框)和一个视图控制器数组。后者将包含您要显示的所有视图。
这是一个向您展示其工作原理的简单示例:
appDelegate.h 包含以下声明:
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (weak) IBOutlet NSButton *swapViewButton;
@property (weak) IBOutlet NSBox *viewBox;
@property NSMutableArray *viewControllers;
@property NSUInteger currentView;
-(IBAction)swapViewOnButtonclick:(id)sender;
-(void)displayViewController:(NSViewController *)vc;
@end
appDelegate.m 包含以下方法:
#import "AppDelegate.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
@synthesize viewControllers;
@synthesize currentView;
-(id)init
{
self = [super init];
if(self)
{
viewControllers = [[NSMutableArray alloc]init];
NSViewController *vc;
vc = [[SecondViewController alloc]init];
[viewControllers addObject:vc];
vc = [[FirstViewController alloc]init];
[viewControllers addObject:vc];
}
NSLog(@"The number of views in the view controller array is: %ld.\n", [viewControllers count]);
return self;
}
-(void)displayViewController:(NSViewController *)vc
{
NSWindow *w = [_viewBox window];
BOOL ended = [w makeFirstResponder:w];
if(!ended)
{
NSBeep();
return;
}
NSView *v = [vc view];
[_viewBox setContentView:v];
}
-(IBAction)swapViewOnButtonclick:(id)sender
{
if(!currentView)
{
currentView++;
}else
{
currentView = 0;
}
NSLog(@"Current view is: %ld.\n", currentView);
NSViewController *vc = [viewControllers objectAtIndex:currentView];
[self displayViewController:vc];
}
-(void)awakeFromNib
{
currentView = 0;
[self displayViewController:[viewControllers objectAtIndex:currentView]];
}
@end
视图控制器类似,只是示例中有一个初始值设定项。我在视图上放置了一个文本标签,其中包含文本“第一/第二视图”。当然,这只是视图交换如何工作的一个示例。您可以根据应用程序的需要将其变得尽可能复杂。希望这可以帮助。
MacUserT
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)