Xcode单窗口,从xib文件显示自定义视图

时间:2015-01-16 00:46:40

标签: objective-c xcode macos cocoa view

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

我目前的做法:

  • 在默认的MainMenu.xib中,我在默认生成的窗口(我将使用的窗口)中为自定义视图创建了一个插座。我们称之为MainView

  • 我创建了一个带有xib文件的视图控制器。在xib中,我为它创建了一个视图和一个插座。我们称之为CustomView1。我稍后会在这个视图控制器中有多个视图。

  • AppDelegate.h我导入了视图控制器,并将其指定为: @property (strong, nonatomic) MasterViewController *masterViewController;

  • AppDelegate.mapplicationDidFinishLaunching我尝试显示自定义视图: _MainView = _masterViewController.CustomView1;

目前,这会导致一个空窗口。我怀疑我的方式是错误的。这样做的最佳方式是什么?

2 个答案:

答案 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