2

这实际上是一个两部分的问题,希望我的解释清楚:

我有一个 NSViewController 可以配置为在其部分视图上显示不同的自定义视图。例如,它的视图可以显示 CustomViewA 或 CustomViewB。

我可以通过为每个自定义视图创建一个 NSViewController 并使用处理 CustomViewA 的 NSViewController 或处理 CustomViewB 的 NSViewController 初始化 MyViewController 来完成这项工作。我使用 NSBox 并将其 contentView 设置为给定 NSViewController 提供的视图。

这种方法的问题是我有一个 NSBox,它的 contentView 将保存“MyView”,然后在“MyView”内我有另一个 NSBox,它将保存 CustomViewA 或 CustomViewB。

另一个问题是我希望 MyViewController 能够同时处理 CustomViewA 和 CustomViewB,而不是为它们中的每一个设置一个单独的 NSViewController。

这是我当前解决方案的示例代码:

// How I initialize the NSViewControllers
CustomViewControllerA* cvc = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil];
MyViewController* controller = [[MyViewController alloc] initWithCustomViewController:cvc nibName:@"MyView" bundle:nil];

//...

// In Controller of main view
- (void)awakeFromNib
{
    // container is an NSBox*
    [self.container setContentView:[self.myViewController view]];
}

//...

//  In MyViewController
-(void)awakeFromNib
{
    // content is an NSBox*
    [self.content setContentView:[self.customViewController view]];
}

如何让我的 CustomViewA 和 CustomViewB 存在于 MyView.nib 中,并且它们都使用 MyViewController 作为它们的控制器?

我怎么能让主视图保存 MyView 而不是 NSBox?

提前致谢!

4

3 回答 3

2

这是我可能会进行设置的方式。

@interface MyViewController : NSViewController
{
    IBOutlet NSView* customView; //initially points to an NSBox or generic custom view from the nib file
    CustomViewControllerA* viewControllerA;
    CustomViewControllerB* viewControllerB;
}

@end

@implementation MyViewController

- (void)switchToCustomViewController:(NSViewController*)newCustomViewController
{
    //Make sure the subview gets put in the right location
    [newCustomViewController.view setFrame:customView.frame];
    [self.view replaceSubview:customView withView:newCustomViewController.view];
    customView = newCustomViewController.view;
}

//I usually use loadView in NSViewControllers rather than awakeFromNib, but either works
- (void)loadView
{
    [super loadView];
    viewControllerA = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil];
    viewControllerB = [[CustomViewControllerB alloc] initWithNibName:@"CustomViewB" bundle:nil];
    [self switchToCustomViewController:viewControllerA];
}

@end

因此,不是将自定义视图放在 NSBox 中,而是在 nib 中包含一个视图作为临时占位符,当您第一次切换到其中一个自定义视图时,该占位符将被删除。然后,当你想交换时,你只需调用-switchToCustomViewController:你想切换到的控制器。从那时起,当您切换时,您只是将一个自定义视图交换为另一个作为 MyViewController 视图的直接子视图。如果您希望能够指定哪个应该是最初使用的,只需创建一个 init 方法或简单的属性,可以设置它来告诉 MyViewController 应该首先使用哪个自定义视图。

于 2010-07-17T23:39:11.740 回答
0

尝试这个:

// In MyViewController.m
- (void) awakeFromNib {
  [self.view addSubview:[self.customViewController.view]];
}

并且您的 MyViewController 必须有一个参数,例如:

// In MyViewController.h
@interface MyViewController : NSViewController {
  IBOutlet NSViewController* customViewController;
}
于 2010-07-17T18:47:38.793 回答
0

NSViewController 并不是真正打算处理交换进出的多个视图。它主要用于处理从 Nib/Xib 加载的单个视图,管理顶级对象的内存并提供方便的绑定功能。典型的使用模型是为每个视图子类化 NSViewController,就像您当前所做的那样。

于 2010-07-18T09:18:40.480 回答