从 ViewController 强制刷新 NSView (AppDelegate)



我有一个名为 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];

最新更新