osx在两个nsviews之间切换

时间:2013-03-26 19:38:00

标签: objective-c macos cocoa interface-builder

按下按钮后,我想在两个NSView控件之间切换。基本上,我有.xib文件,其中包含NSWindow控件。窗口包含两个子视图和几个按钮。我在对象列表中拖了NSViewController,在xib中拖了一个NSViewNSViewController引用了来自NSWindow的视图和在xib文件中浮动的视图。

问题是,按下按钮后如何在NSWindow中切换nsview1和nsview2?这是正确的方法吗?

sketch

1 个答案:

答案 0 :(得分:8)

为可交换视图所在的占位符定义NSView插座,以及用于保持对当前正在使用的视图控制器的引用的属性。

@property (assign) IBOutlet NSView* mainView;
@property (strong) NSViewController* currentViewController;

我使用通用方法进行视图交换(使用autolayout使视图占用整个占位符视图)。

-(void)setMainViewTo:(NSViewController *)controller
{
    //Remove existing subviews
    while ([[self.mainView subviews] count] > 0)
    {
        [self.mainView.subviews[0] removeFromSuperview];
    }
    NSView * view = [controller view];
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.mainView addSubview:view];

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(view);   

    [self.mainView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewsDictionary]];

    [self.mainView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewsDictionary]];
    self.currentViewController = controller;
}

现在您可以定义IBOutlets来实例化和交换视图控制器

-(IBAction)showView1:(id)sender
{
    View1Controller * controller = [[View1Controller alloc]init];
    [self setMainViewTo:controller];
}
-(IBAction)showView2:(id)sender
{
    View2Controller * controller = [[View2Controller alloc]init];
    [self setMainViewTo:controller];
}