1

MainMenu.xibにあるNSViewのサブクラスである BackgroundView1 という小さなビュー オブジェクトがあります。メインのView Controllerは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 の実際のビューに接続する必要があります。

3 番目に、そのビューにメッセージを送信する必要があります。

[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 に答える