我有一个名为BackgroundView1的小 View 对象,它是NSView的子类,位于MainMenu.xib上。主视图 Controller 是AppDelegate。该 View 对象显示了一些绘图。不管怎样,我有这个 View 对象的以下代码。
// .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 强制刷新此 View 对象(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];
}
感谢您的帮助。
最佳答案
您的问题是您正在创建一个新对象,要求它进行布局,然后丢弃该对象。这与您 View 中的对象无关。
首先,在 OS X 中,属性 view1
应该是强属性,而不是弱属性。 (这与 iOS 中不同。)
其次,它需要是一个 IBOutlet
,并且您需要将该 IBOutlet 连接到 Interface Builder 中的实际 View 。
第三,您需要将消息发送到该 View :
[self.view1 setNeedsDisplay:YES];
没有理由分配
另一个 View 。
对于 NSView
来说,监视其窗口成为关键有点不寻常(尽管并非闻所未闻)。 NSWindow
更常见的是跟踪此情况并相应地更新其 View 。
这里有很多错误,表明您尚未完成介绍性教程(或尚未理解它们)。我建议从 Your First Mac App 开始.
关于objective-c - 从ViewController(AppDelegate)强制刷新NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19608155/