objective-c - 从ViewController(AppDelegate)强制刷新NSView

标签 objective-c macos cocoa nsview

我有一个名为BackgroundView1的小 View 对象,它是NSView的子类,位于MainMenu.xib上。主视图 Controller 是AppDelegate。该 View 对象显示了一些绘图。不管怎样,我有这个 View 对象的以下代码。

// .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 强制刷新此 View 对象(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];
}

感谢您的帮助。

最佳答案

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

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

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

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

[self.view1 setNeedsDisplay:YES];

没有理由分配另一个 View 。

对于 NSView 来说,监视其窗口成为关键有点不寻常(尽管并非闻所未闻)。 NSWindow 更常见的是跟踪此情况并相应地更新其 View 。

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

关于objective-c - 从ViewController(AppDelegate)强制刷新NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19608155/

相关文章:

objective-c - 当 NSButton 上有另一个控件(如 NSLabel)时,NSButton 单击不起作用

objective-c - NSTextField 不会更新

objective-c - 如何动态类型转换对象以支持应用程序的 ScriptingBridge 头文件的不同版本?

linux - 在 Makefile 中在 Linux 和 MacOS 上使用 sed

C 代码在 Linux 中工作但在 MacOS Mojave 中不工作

sql - 为什么我的 sqlite sql 没有返回结果?

objective-c - 从 NSData 创建多个 NSDocument 的最简洁方法

ios - 如何从 iOS 字典中给定的值中查找键

objective-c - Xcode 报告有关已删除类的错误?

ios - 如何随机化方法?