-1

nibファイルがあり、異なるコンテキストで異なるウィンドウインスタンスを作成しています.すべてのコントロールはタイマーを除いて正常に動作し、タイマーによってトリガーされる変数はすべてのウィンドウで共有されているように見えます. これが私がウィンドウインスタンスを作成する方法です。

#import <Cocoa/Cocoa.h>
#import "MYWindow.h"
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
}
@property (strong) MYWindow *pickerWindow;

--

#import "AppDelegate.h"
@implementation AppDelegate
-(IBAction)newWindow:(id)sender
{
    myWindow = [[MYWindow alloc] initWithWindowNibName:@"MYWindowNIB"];
    [myWindow showWindow:self];
}

また、以前のリリースのウィンドウの新しいインスタンスを開くと、プロパティが強いと宣言していても、ARC に問題があります。これが、フラグ -fno-objc-arc を使用して AppDelegate をコンパイルする理由です。そうでなければ、私が言ったように、私はWindowsをすぐにリリースしました。X コード 4.6

編集

int i = 0;
-(void)windowDidLoad
{
    timerMoveOutNavBar = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUP) userInfo:nil repeats:YES];
}

-(void)countUP
{
    [text setStringValue:[NSString stringWithFormat:@"%d", i]];
    i++;
}
4

2 に答える 2

0

私は解決策を見つけました。変数と他のすべてのオブジェクトをプライベートとして宣言する必要があります。

@private
    int i;
于 2013-02-20T16:04:56.670 に答える
-1

「同じ変数を共有する」とはどういう意味ですか? すべてのウィンドウ コントローラーが継承するスーパークラスを作成できます。その場合は、スーパークラスで作成したプロパティとメソッドがすべて含まれます。

ウィンドウが解放される限り、IB で [閉じたときに解放する] チェックボックスをオンにしていますか? その場合は、そのボックスのチェックを外してください。

編集後

問題は、int 変数「i」を初期化する方法に関係しています。メソッドの外に置くことで、すべてのインスタンスが見るグローバル変数として宣言します。ivar を作成し、タイマーを作成する場所でその値をゼロに設定する必要があります。

@implementation MyWindowController {
   IBOutlet NSTextField *text;
    int i;
}


- (void)windowDidLoad {
    [super windowDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUP:) userInfo:nil repeats:YES];
    i = 0;
}

-(void)countUP:(NSTimer *) timer {
    [text setStringValue:[NSString stringWithFormat:@"%d", i]];
    i++;
    if (i== 50) [timer invalidate];
}

セレクター名にコロンを追加したことに注意してください。タイマーを使用すると、タイマーは自分自身を引数としてセレクターに渡します。そのため、タイマーを無効にする場合と同じように参照できます。ただし、タイマーを ivar またはプロパティ (この場合は timerMoveOutNavBar) に割り当てることで、同じように実行しても問題ありません。

于 2013-02-12T19:40:44.107 に答える