gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:39:22 25 4
gpt4 key购买 nike

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

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com