我正在创建一个OSX应用程序,它有一个窗口。该窗口包含一个视图,在整个使用过程中呈现不同的视图。
我目前的做法:
在默认的MainMenu.xib中,我在默认生成的窗口(我将使用的窗口)中为自定义视图创建了一个插座。我们称之为MainView
。
我创建了一个带有xib文件的视图控制器。在xib中,我为它创建了一个视图和一个插座。我们称之为CustomView1
。我稍后会在这个视图控制器中有多个视图。
在AppDelegate.h
我导入了视图控制器,并将其指定为:
@property (strong, nonatomic) MasterViewController *masterViewController;
在AppDelegate.m
中applicationDidFinishLaunching
我尝试显示自定义视图:
_MainView = _masterViewController.CustomView1;
目前,这会导致一个空窗口。我怀疑我的方式是错误的。这样做的最佳方式是什么?
答案 0 :(得分:4)
您的错误在于您最初没有显示第一个视图。这是我学习如何在窗口内外交换视图的方法。无论是最好的方式,都不是由我决定的。与您的方法的不同之处在于您应该将视图与窗口分离。可能有更好的方法,但正式教授以下方法。
使用你的mainmenu.xib窗口控制器。在窗口中放置一个框并将框边框设置为无。您将拥有一个隐藏的框,它将成为您视图的容器。
创建任意数量的viewcontrollers,以获得不同的视图。当然,这是通过创建一个新类作为NSViewController的子类。在你的主类(也许是appDelegate,但它可以是其他类)你至少创建一个NSBox的IBOutlet(你在主窗口中删除的框)和一组viewcontrollers。后者将包含您要显示的所有视图。
以下是一个简单的示例,向您展示它的工作原理:
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
视图控制器类似,样本中只有一个初始化器。我在文本&#34;第一/第二视图&#34;上删除文本标签。当然,这只是视图交换工作的一个例子。您可以根据应用的需要使其变得复杂。希望这会有所帮助。
MacUserT
答案 1 :(得分:0)
该项目位于Github https://github.com/MacUserT?tab=repositories。
我还在存储库中添加了应用程序,因此您可以直接从文件夹中运行它。如果您下载项目,您应该能够在xcode中打开它,编译并运行它。您应该获得与我上传的应用程序相同的结果。
我希望这会有所帮助。
亲切的问候, MacUserT