我有一个名为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中也有以下代码。
// 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];
}
感谢您的帮助。
答案 0 :(得分:3)
您的问题是您正在创建一个新对象,要求它进行布局,然后丢弃该对象。这与您视图中的对象无关。
首先,在OS X中,属性view1
应该是强大的,而不是弱的。 (这与iOS不同。)
其次,它需要是IBOutlet
,您需要将IBOutlet连接到Interface Builder中的实际视图。
第三,您需要将消息发送到该视图:
[self.view1 setNeedsDisplay:YES];
没有理由alloc
另一种观点。
NSView
监视其窗口成为关键,这有点不寻常(尽管不是闻所未闻)。 NSWindow
更常见的是跟踪此情况并相应地更新其视图。
这里有很多错误表明你没有完成入门教程(或者没有理解它们)。我建议从Your First Mac App开始。
答案 1 :(得分:2)
只需在您的操作中实现这行代码,无需强行刷新视图: -
[view1 setNeedsDisplay:YES];