自定义NSView与出口

时间:2013-11-03 17:11:44

标签: macos cocoa nsview

是Mac应用程序的新用户,我正在编写一个简单的应用程序,该应用程序具有应用程序不同部分的通用布局。它基本上是一个图像,在所有部分都有一个或两个按钮(标题保持不变)。

所以我考虑在一个新的Nib文件和一个单独的类文件(MyCustomView,它是NSView的一个子类)中创建一个CustomNSView一个Image Well和两个圆形按钮,它会在{}中加载这个Nib {1}}方法。所以现在,当我拖动自定义视图并将其类设置为initWithframe时,我立即获得了图像和两个按钮而没有任何其他代码。但是现在我如何控制其他View Controllers中的这些按钮(outlet / actionms)?每个地方都会使用相同的视图,因此我无法将nib中的文件所有者设置为视图控制器?

这样做是对的吗?是否有任何方法可以创建一个自定义视图,该视图将委托所有按钮操作分配给它所包含的控制器?

2 个答案:

答案 0 :(得分:0)

您可以编写自定义代理。虽然使用它,但您可以将消息从一个对象发送到另一个对象

答案 1 :(得分:0)

这是我将如何做到的。我不会创建一个CustomNSView,我会创建一个CustomViewController(包含其xib文件)。在那个CustomViewController上,我会设计两个按钮并像这样设置CustomViewController.h。

@property (nonatomic, weak) id delegate; // Create a delegate to send call back actions
-(IBAction)buttonOneFromCustomVCClicked:(id)sender;
-(IBAction)buttonTwoFromCustomVCClicked:(id)sender;

CustomViewController.m就像这样。

-(void)buttonOneFromCustomVCClicked:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonOneFromCustomVCClicked:)]) {
        [self.delegate buttonOneFromCustomVCClicked:sender];
    }
}

-(void)buttonTwoFromCustomVCClicked:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonTwoFromCustomVCClicked:)]) {
    [self.delegate buttonTwoFromCustomVCClicked:sender];
    }
}

在customViewController的界面构建器中,将两个按钮的SentAction事件链接到两个方法(它们应显示在file's owner中)。

然后在你想要加载通用自定义视图的otherClass中,像这样实例化通用视图控制器。

#import "customViewController.h"

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    customViewController *newCustomViewController = [[ViewController alloc] initWithNibName:@"customViewController" bundle:nil];
    [newCustomViewController setDelegate:self];

    self.backGroundView = [newCustomViewController view]; // Assuming **backGroundView** is an image view on your background that will display the newly instantiated view
}

-(void)buttonOneFromCustomVCClicked:(id)sender {
    // Code for when button one is clicked
}

-(void)buttonTwoFromCustomVCClicked:(id)sender {
    // Code for when button two is clicked
}