没有使用setNeedsDisplay

时间:2016-07-20 06:27:16

标签: cocoa

我的ui结构就像NSWindow - > NSViewController - > NSView(父母) - > NSView(目标视图)。 目标视图是从XIB文件拖出的,而不是addSubview。显示NSView(父级)时将调用drawRect函数,但之后我想用setNeedsDisplay以编程方式再次调用drawRect,它不起作用。 我的方法有什么问题?

无论如何,我可以使用drawRect(view.frame)来实现它,但我认为这不是一个好主意。

代码:

MyView.m

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    NSLog(@"asasa");
}

...
@property (weak) IBOutlet MyView *titleBarView;
...

-(IBAction)test:(id)sender
{
    NSLog(@"%@",self.view.subviews); // contains the titleBarView
    NSLog(@"%@",self.titleBarView); // not nil
    [self.titleBarView setNeedsDisplay:YES]; // not call drawRect
}

titleBarView已经连接

1 个答案:

答案 0 :(得分:1)

您现在正在执行的操作会触发drawRect:的{​​{1}},而不是self.titleBarView。要触发self.view drawRect: self.view声明的NSLog,请在setNeedsDisplay上致电self.view

- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];

NSLog(@"asasa");
}

...
@property (weak) IBOutlet MyView *titleBarView;
...

-(IBAction)test:(id)sender
{
    NSLog(@"%@",self.view.subviews); // contains the titleBarView
    NSLog(@"%@",self.titleBarView); // not nil
    [self.titleBarView setNeedsDisplay:YES]; // this triggers the drawRect: method of self.titleBarView
    [self.view setNeedsDisplay:YES]; // this triggers your drawRect: method with he NSLog statement
}