objective-c - 如何让 NSViewController 的 View 内容取决于它的初始化方式?

标签 objective-c cocoa nsviewcontroller

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

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

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

这种方法的问题是,我有一个 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 作为 Controller ?

如何让主视图包含 MyView 而不是 NSBox?

提前致谢!

最佳答案

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

@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

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

关于objective-c - 如何让 NSViewController 的 View 内容取决于它的初始化方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272770/

相关文章:

objective-c - Cocoa - 防止系统关闭

xcode - NSWindow 与 ViewController - OS X - Cocoa

Cocoa:NSViewController View 中的 setter

objective-c - 对指向接口(interface) 'NSDate' 的指针进行算术运算,这在非脆弱 ABI 中不是常量大小

iphone - 我如何在 iOS 中实现一个字符串过滤算法来反射(reflect) 'Messages' 中的联系人自动完成?

ios - 代码 5 : Is there any way to group/filter/sort what shows up in code-completion?

objective-c - Cocoa:改变 cocoa 向用户报告模型验证错误的方式

cocoa - 如何使用NSScanner扫描^[a-zA-Z_][a-zA-Z0-9_]*的格式

iphone - 当多个项目同时打开时,XCode 如何知道要调试到哪个项目?

objective-c - 如果它是自定义类,则获取 NSViewController View ?