如何在两个NSView对象之间进行通信?

时间:2014-03-07 17:32:29

标签: objective-c macos cocoa

使用Cocoa,我希望在一个图像视图中显示一个图像。每当我点击显示的图像。点击点周围的一段预定义大小的图像将显示在与第一个图像相同的窗口中的另一个图像视图中。所以会看到细节。

为此,我编写了自己的继承自NSImageView的MyImageView。在本课程中,我实现了mouseUp方法。在这个方法中,我做了所有图像坐标的事情。到目前为止我能做到这一点。新作品将作为财产存储。

#import "MyImageView.h"

@implementation MyImageView
@synthesize point;
@synthesize small_img;
@synthesize big_img;

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.point = NSMakePoint(0.0, 0.0);
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
        [super drawRect:dirtyRect];

    // Drawing code here.
}

- (void)mouseUp:(NSEvent *)theEvent
{
    //calculate the small image and stored in small_img
}

@end

然后我在AppDelegate中初始化一个实例并执行类似的操作     [small_view setImage:myImageView.small_img] 但不会显示小图片。

似乎委托机制将会成功。但是,我对View-Controller-Delegate模式非常困惑。而且我找不到任何材料来解释两个NSView子类对象之间的通信以及我能理解的示例代码。我完全是这个领域的新手。

希望有人帮我完成这件事,因为这对我来说非常重要。谢谢!

1 个答案:

答案 0 :(得分:3)

你认为委托机制可行。但还有其他选择。

基本上你有两个ImageViews(或子类),但它们无法通信。他们唯一的共同点是容器或所有者(通常是一个ViewController,但它可能是AppDelegate),所以让我们将这个对象称为所有者

要进行通信,单击的ImageView需要通知所有者发生了某些事情,然后所有者会将此通知转发给第二个ImageView。第一个通知可以通过委托完成,第二个方法很简单(调用[mySecondImageView someMethod];

在这里解释如何使用委托会太长,而且有很多例子。简而言之,第一个ImageView具有委托属性,而所有者将自身设置为委托(类似myFirstImageView.delegate = self];

如果这太复杂,另一个可能适合的解决方案是使用通知。同样,有很多示例,但简而言之,通知将允许在没有所有者干预的情况下传达您的两个ImageView。这种类型的通信适用于松散耦合的对象。

编辑:
您当然可以将第二个视图设置为委托,它可以完美地工作。我个人喜欢集中控制我的ViewController中的所有对象,但这是我个人的偏好。

您需要什么样的代表?您需要创建自定义委托(@protocol)。

@protocol imageViewProtocol
- (void)imageClicked:(... arguments...); 
@end

您的FirstImageView将在@interface

中声明一个属性
@interface FirstImageView ...
@property (...) id<imageViewProtocol> delegate;
...
@end

@implementation FirstImageView ...
- (void)ImageClick:(id)sender
{
    // do stuff
    [self.delegate imageClicked:(...arguments...)];
}
@end