我有一个名为 BackgroundView1 的小视图对象,它是 NSView 的一个子类,位于 MainMenu.xib 上。 主视图控制器是 AppDelegate。 此视图对象显示一些绘图。 无论如何,我有此视图对象的以下代码。
// .h
@interface BackgroundView1 : NSView
// .m
@implementation BackgroundView1
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:[self window]];
}
- (void) windowDidBecomeKey:(NSNotification *)notification {
[self setNeedsDisplay:YES];
}
- (void)drawRect:(NSRect)rect {
// ...
// ...
}
我想知道当用户单击按钮时,是否有任何方法可以从 AppDelegate 强制刷新此视图对象 (BackgroundView1)? 我在应用程序代表中也有以下代码。
// AppDelegate.h
#import "BackgroundView1.h"
@interface AppDelegate : NSObject
@property (weak) BackgroundView1 *view1;
// AppDelegate.m
- (IBAction)button1Clicked:(id)sender {
BackgroundView1 *view1 = [[BackgroundView1 alloc] init];
[view1 setNeedsLayout:YES];
}
谢谢你的帮助。
你的问题是你正在创建一个新对象,要求它布局,然后扔掉那个对象。这与视图中的对象无关。
首先,在OS X中,属性view1
应该是强的,而不是弱的。(这与在 iOS 中不同。
其次,它需要是一个IBOutlet
,并且您需要将该IBOutlet连接到Interface Builder中的实际视图。
第三,您需要将消息发送到该视图:
[self.view1 setNeedsDisplay:YES];
没有理由alloc
另一种观点。
一个NSView
来说,观察它的窗口成为钥匙是有点不寻常的(尽管并非闻所未闻)。NSWindow
更常见的做法是跟踪这一点并相应地更新其观点。
这里有很多错误表明您没有完成介绍性教程(或者没有理解它们)。我建议从您的第一个Mac应用程序开始。
只需在您的操作中实现这行代码,无需强制刷新视图:-
[view1 setNeedsDisplay:YES];