Xcode 单个 window,显示来自 xib 文件的自定义视图
Xcode single window, display custom view from xib file
我正在创建一个 OSX 应用程序,其中有一个 window。此 window 包含单个视图,在整个使用过程中呈现不同的视图。
我目前的做法:
在默认 MainMenu.xib 中,我在默认生成的 window 中为自定义视图创建了一个出口(这是我将使用的 window ).我们称它为 MainView
.
我用 xib 文件创建了一个视图控制器。在xib中,我为它创建了一个view和一个outlet。我们称它为 CustomView1
。稍后我将在这个视图控制器中有多个视图。
在 AppDelegate.h
中,我导入了视图控制器,并将其分配为:
@property (strong, nonatomic) MasterViewController *masterViewController;
In AppDelegate.m
in applicationDidFinishLaunching
我尝试显示自定义视图:
_MainView = _masterViewController.CustomView1;
目前这会导致空 window。我怀疑我正在以错误的方式解决这个问题。执行此操作的最佳方法是什么?
您的错误是您最初没有显示您的第一个视图。这是我学习如何在 window 中交换视图的方法。这是否是最好的方法,不取决于我。您的方法的不同之处在于您应该将视图与 window 分离。可能有更好的方法,但是官方教了下面的方法。
将您的 mainmenu.xib 用作 window 控制器。在 window 中放置一个框并将框边框设置为 None。您将有一个不可见的框,它将成为您的视图的容器。
创建任意数量的视图控制器以拥有不同的视图。当然,这是通过创建一个新的 class 作为 NSViewController 的子 class。在你的 main class(也许是 appDelegate,但它可以是其他一些 class)你至少创建一个 NSBox 的 IBOutlet(你在 main window 中 droppend 的框)和一个数组视图控制器。后者将包含您要显示的所有视图。
这是一个简单的示例,向您展示它是如何工作的:
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
视图控制器相似,示例中只有一个初始化程序。我在视图上放置了一个文本标签,文本为 "first/second view"。当然,这只是视图交换如何工作的示例。您可以根据您的应用程序的需要将其复杂化。希望这有帮助。
MacUserT
项目在 Github https://github.com/MacUserT?tab=repositories。
我还在存储库中添加了该应用程序,因此您可以 运行 直接从您的文件夹中获取它。如果您下载该项目,您应该能够在 xcode 中打开它,编译它并 运行 它。您应该得到与我上传的应用程序相同的结果。
我希望这对您有所帮助并且有效。
亲切的问候,
MacUserT
我正在创建一个 OSX 应用程序,其中有一个 window。此 window 包含单个视图,在整个使用过程中呈现不同的视图。
我目前的做法:
在默认 MainMenu.xib 中,我在默认生成的 window 中为自定义视图创建了一个出口(这是我将使用的 window ).我们称它为
MainView
.我用 xib 文件创建了一个视图控制器。在xib中,我为它创建了一个view和一个outlet。我们称它为
CustomView1
。稍后我将在这个视图控制器中有多个视图。在
AppDelegate.h
中,我导入了视图控制器,并将其分配为:@property (strong, nonatomic) MasterViewController *masterViewController;
In
AppDelegate.m
inapplicationDidFinishLaunching
我尝试显示自定义视图:_MainView = _masterViewController.CustomView1;
目前这会导致空 window。我怀疑我正在以错误的方式解决这个问题。执行此操作的最佳方法是什么?
您的错误是您最初没有显示您的第一个视图。这是我学习如何在 window 中交换视图的方法。这是否是最好的方法,不取决于我。您的方法的不同之处在于您应该将视图与 window 分离。可能有更好的方法,但是官方教了下面的方法。
将您的 mainmenu.xib 用作 window 控制器。在 window 中放置一个框并将框边框设置为 None。您将有一个不可见的框,它将成为您的视图的容器。
创建任意数量的视图控制器以拥有不同的视图。当然,这是通过创建一个新的 class 作为 NSViewController 的子 class。在你的 main class(也许是 appDelegate,但它可以是其他一些 class)你至少创建一个 NSBox 的 IBOutlet(你在 main window 中 droppend 的框)和一个数组视图控制器。后者将包含您要显示的所有视图。
这是一个简单的示例,向您展示它是如何工作的:
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
视图控制器相似,示例中只有一个初始化程序。我在视图上放置了一个文本标签,文本为 "first/second view"。当然,这只是视图交换如何工作的示例。您可以根据您的应用程序的需要将其复杂化。希望这有帮助。
MacUserT
项目在 Github https://github.com/MacUserT?tab=repositories。
我还在存储库中添加了该应用程序,因此您可以 运行 直接从您的文件夹中获取它。如果您下载该项目,您应该能够在 xcode 中打开它,编译它并 运行 它。您应该得到与我上传的应用程序相同的结果。
我希望这对您有所帮助并且有效。
亲切的问候, MacUserT