如何设置委托从不同的方法访问

时间:2013-03-08 08:11:34

标签: objective-c macos delegates nswindow

我有一些代码,我试图用方法显示我的prefwindow,但我剪掉了其余部分并离开了窗口init和另一种方法。那么我如何跨方法访问对象?

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@interface hello : NSObject <NSApplicationDelegate> {
    NSWindow *prefwindow;
}

@property (assign) IBOutlet NSWindow *window;

-(void)openPrefs;

@end

@implementation hello;
@synthesize window;

int main (int argc, const char * argv[]) {
    hello *self = [[hello alloc] init]; 
    [NSAutoreleasePool new];
    [NSApplication sharedApplication];

    id prefwindow = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 350, 150)
                                                 styleMask:(NSTitledWindowMask | NSClosableWindowMask) backing:NSBackingStoreBuffered defer:NO]
                     autorelease];
    [prefwindow center];
    [prefwindow setTitle:appName];
    [prefwindow setDelegate:self];
    [self openPrefs];

    [NSApp setDelegate:self];
    [NSApp run];
    return 0;
}

-(void)openPrefs {
    [NSApp activateIgnoringOtherApps: YES];
    [prefwindow makeKeyAndOrderFront: self];
}

@end

2 个答案:

答案 0 :(得分:1)

您无法访问main函数中“hello”类的“prefwindow”变量。它超出了范围。为了改变变量,我相信你会想写

self.prefwindow = ...

答案 1 :(得分:0)

使用id prefwindow =,您将声明一个名为prefWindow的新对象。如果要使用标头中声明的那个,请不要再声明它。只做:

prefwindow = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 350, 150)
                                             styleMask:(NSTitledWindowMask | NSClosableWindowMask) backing:NSBackingStoreBuffered defer:NO]
                 autorelease];

您所做的只是声明一个新对象,其名称与您在标题中声明的对象相同。