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

Sam*_*Lee 2 cocoa interface-builder

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

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

我该如何编程呢?

Mar*_*eau 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]];
}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该使用单个前导下划线来启动您的ivar或方法名称.这是一个内部的Apple编码约定,他们采用这种约定来避免名称与外部开发人员代码冲突的危险. (3认同)
  • @NSResponder我认为这实际上已经改变了.当你让编译器现在合成ivars时,它实际上用前导下划线自动填充它们. (2认同)