gpt4 book ai didi

objective-c - 两个NSView对象之间如何通信?

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

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

为此,我编写了自己的继承自 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]但不会显示小图像。

看来委托(delegate)机制将会奏效。但是,我对 View - Controller -委托(delegate)模式感到非常困惑。我找不到任何 Material 用我能理解的示例代码来解释两个 NSView 子类对象之间的通信。我在这个领域完全是新手。

希望有人帮助我完成这项工作,因为这对我来说非常重要。谢谢!

最佳答案

您说的委托(delegate)机制可以发挥作用是正确的。但还有其他选择。

基本上,您有两个 ImageView(或子类),并且它们无法通信。它们唯一的共同点是容器或所有者(通常是 ViewController,但也可能是 AppDelegate),因此我们将这个对象称为所有者。

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

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

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

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

您需要什么样的代表?您需要创建一个自定义委托(delegate)(@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

关于objective-c - 两个NSView对象之间如何通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22256839/

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