从ViewController强制刷新NSView(AppDelegate)

时间:2013-10-26 15:01:18

标签: objective-c macos cocoa nsview

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

感谢您的帮助。

2 个答案:

答案 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];