1

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

谢谢你的帮助。

4

2 回答 2

3

您的问题是您正在创建一个新对象,要求它进行布局,然后丢弃该对象。这与您视图中的对象无关。

首先,在 OS X 中,属性view1应该是强的,而不是弱的。(这与 iOS 不同。)

其次,它必须是一个IBOutlet,并且您需要将该 IBOutlet 连接到 Interface Builder 中的实际视图。

第三,您需要将消息发送到该视图:

[self.view1 setNeedsDisplay:YES];

没有理由换alloc一种看法。

NSView观察它的窗口成为关键有点不寻常(尽管并非闻所未闻) 。更常见的是NSWindow跟踪这一点并相应地更新其视图。

这里有很多错误表明您没有完成介绍性教程(或没有理解它们)。我建议从Your First Mac App开始。

于 2013-10-26T17:36:45.897 回答
2

只需在您的操作中实现这行代码,无需强制刷新视图:-

     [view1 setNeedsDisplay:YES];
于 2013-10-26T17:07:45.873 回答