2013-10-26 68 views
1

我有一个名为BackgroundView1的小视图对象,它是NSView的一个子类,坐在MainMenu.xib上。主视图控制器是AppDelegate。该视图对象显示一些图形。无论如何,我有这个视图对象的下面的代码。从ViewController强制刷新NSView(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]; 
} 

感谢您的帮助。

回答

1

只是实现这个代码行你的行动没有必要强行刷新视图: -

 [view1 setNeedsDisplay:YES]; 
3

您的问题是,你正在创建一个新的对象,要求它的布局,然后扔掉那个对象。这与您视图中的对象无关。

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

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

第三,你需要然后将消息发送到该视图:

[self.view1 setNeedsDisplay:YES]; 

没有理由alloc另一种观点。

对于NSView来说,它的窗口成为关键是有点不寻常(虽然没有听说过)。 NSWindow更常见于此,并相应地更新其视图。

这里有很多错误提示你没有完成入门教程(或者没有理解它们)。我建议从Your First Mac App开始。