gpt4 book ai didi

objective-c - Xcode单一窗口,显示来自xib文件的自定义 View

转载 作者:行者123 更新时间:2023-12-03 16:28:29 27 4
gpt4 key购买 nike

我正在创建一个 OSX 应用程序,它有一个窗口。该窗口包含一个 View ,在整个使用过程中呈现不同的 View 。

我目前的方法:

  • 在默认的 MainMenu.xib 中,我在默认生成的窗口(这是我将使用的窗口)中为自定义 View 创建了一个导出。我们将其命名为 MainView

  • 我使用 xib 文件创建了一个 View Controller 。在 xib 中,我为其创建了一个 View 和一个导出。我们将其命名为 CustomView1。稍后我将在此 View Controller 中拥有多个 View 。

  • AppDelegate.h 中,我导入了 View Controller ,并将其分配如下:@property(强,非原子)MasterViewController *masterViewController;

  • applicationDidFinishLaunchingAppDelegate.m 中,我尝试显示自定义 View :_MainView = _masterViewController.CustomView1;

目前这会导致一个空窗口。我怀疑我以错误的方式处理这件事。最好的方法是什么?

最佳答案

您的错误是您最初没有显示您的第一个 View 。这是我学习如何在窗口中交换 View 的方法。这是否是最好的方法,不取决于我。您的方法的不同之处在于您应该将 View 与窗口分离。可能还有更好的方法,但官方教授的是以下方法。

使用 mainmenu.xib 作为窗口 Controller 。在窗口中拖放一个框并将框边框设置为“无”。您将有一个看不见的盒子,它将作为您的 View 的容器。

创建任意数量的 View Controller 以获得不同的 View 。当然,这是通过创建一个新类作为 NSViewController 的子类来实现的。在你的主类(可能是 appDelegate,但也可以是其他类)中,你至少创建一个 NSBox 的 IBOutlet(你在主窗口中放置的框)和一个 View Controller 数组。后者将包含您想要显示的所有 View 。

这是一个简单的示例,向您展示其工作原理:

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

View Controller 类似,只是示例中有一个初始值设定项。我在 View 上放置了一个文本标签,其中包含文本“第一/第二 View ”。当然,这只是 View 交换如何工作的一个示例。您可以根据应用程序的需要将其变得尽可能复杂。希望这会有所帮助。

Mac用户T

关于objective-c - Xcode单一窗口,显示来自xib文件的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27975635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com