-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 的原因。否则,正如我所说的那样,我所做的一切都会立即发布。XCode 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 回答