Xcode 单个 window,显示来自 xib 文件的自定义视图

Xcode single window, display custom view from xib file

我正在创建一个 OSX 应用程序,其中有一个 window。此 window 包含单个视图,在整个使用过程中呈现不同的视图。

我目前的做法:

目前这会导致空 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