在OS X上,将GUI分成多个NIB文件和NSView子类

时间:2009-01-22 23:40:27

标签: cocoa interface-builder

我正在开发OS X / Cocoa应用程序,我想要这样的行为:

  • 有一个侧边栏有不同的选项,让我们说“选项A”,“选项B”和“选项C”。
  • 单击A,B或C时,会将相应的GUI加载到主窗格中。每个GUI都是不同的NSView子类,它在不同的NIB / XIB文件中定义。例如,选项A可能是3个按钮,并且是NSViewSubclassA的实例,而选项B可能有1个按钮和一个文本字段,并且是NSViewSubclassB的实例。

我将如何编程呢?

1 个答案:

答案 0 :(得分:7)

从子类化NSViewController开始,因此每个子视图都有一个控制器。在操作方法中,当用户单击按钮以在视图之间切换时,可以使用适当的类和nib创建新的视图控制器(在窗口控制器中的ivar中保留对它的引用)。视图控制器充当笔尖的所有者。然后你要做的就是在主窗口中添加视图控制器的视图作为子视图,然后进行设置。

这是一个简单的例子。在执行一些非相关任务之后,在操作方法(以及启动后)的主窗口控制器中调用它;唯一棘手的部分是修补响应者链(如果你很幸运,你可能不需要这样做)。

- (void)_setAccessoryViewControllerFromTag:(NSInteger)tag;
{
    if ( _accessoryContentViewController != nil )
    {
        [self setNextResponder:[_accessoryContentViewController nextResponder]];
        [_accessoryContentViewController release];
    }

    switch ( tag )
    {
        case 0:
            _accessoryContentViewController = [[RLGraphsViewController alloc] initWithNibName:@"GraphsView" bundle:nil];
            break;
        case 1:
            _accessoryContentViewController = [[RLSummaryViewController alloc] initWithNibName:@"SummaryView" bundle:nil];
            break;
        case 2:
            _accessoryContentViewController = [[RLEquipmentViewController alloc] initWithNibName:@"EquipmentView" bundle:nil];
            break;
        default:
            _accessoryContentViewController = [[RLLocationsViewController alloc] initWithNibName:@"LocationsView" bundle:nil];
            break;
    }

    [_accessoryContentViewController setNextResponder:[self nextResponder]];
    [self setNextResponder:_accessoryContentViewController];        
    [self.accessoryView setContentView:[_accessoryContentViewController view]];
}