2012-02-26 67 views
0

我有一個類RandomGenerator:值設置爲忽略的NSTextField

// RandomGenerator.h 
#import <Foundation/Foundation.h> 
@interface RandomGenerator : NSObject 
{ 
    @private 
    IBOutlet NSTextField* textField; 
    unsigned int number; 
} 
@end 

//RandomGenerator.m 
#import "RandomGenerator.h" 
@implementation RandomGenerator 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     textField=[[NSTextField alloc]init]; 
     [textField setStringValue:@"Insert a number between 1 and 100"]; 
     srand((unsigned int)time(NULL)); 
    } 
    return self; 
} 
- (void)dealloc 
{ 
    [super dealloc]; 
} 
@end 

所構建時,它將自動設置的NSTextField的值。 我從文件GuessTheNumberAppDelegate.m分配RandomGenerator對象:

#import "GuessTheNumberAppDelegate.h" 
#import "RandomGenerator.h" 
@implementation GuessTheNumberAppDelegate 
@synthesize window; 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init]; 
    RandomGenerator* random=[[RandomGenerator alloc]init]; 
    [pool drain]; 
} 
@end 

而且我已在界面生成器連接:

Connection

Interface builder screen

不過的NSTextField的含量沒有改變,看起來是一樣的,爲什麼呢?

Result

回答

1

-[RandomGenerator init],你要創建一個沒有關係的文本字段已經在您XIB文件文本字段對象,並指着新對象出口。 xib中的對象是真實的,由加載機制爲您分配的實際對象。你不需要textField = [[NSTextField alloc] init];,*也不需要RandomGenerator* random=[[RandomGenerator alloc]init];。這兩個對象都已經存在於你的xib中。

但是你確實需要改變一些東西。首先,如果您希望應用程序代理能夠訪問RandomGenerator,則需要給它一個插座並將它連接起來:IBOutlet RandomGenerator * generator;。其次,您需要將[textField setStringValue:@"Insert a number between 1 and 100"];移出-[RandomGenerator init]。由於筆尖加載的方式,發生器的init方法將在文本字段的IBOutlet連接之前被調用,並且可能在文本字段被創建之前被調用。

我敢肯定,如果你增加:

- (void)awakeFromNib { 
    [textField setStringValue:@"Insert a number between 1 and 100"]; 
} 

RandomGenerator,會做的伎倆。一旦裝入了筆尖並重新創建了筆尖中的所有對象,則應將awakeFromNib發送給所有這些對象。


*這不是一個NSTextField反正

1

我與Josh同意正確的初始化,特別是在awakeFromNib一部分。下面是一些額外的筆記/測試,我編碼這只是爲了檢查它。下面是RandomGenerator文件,但簡單地表示什麼,我認爲你的問題是關於:

// RandomGenerator.h 
#import <Foundation/Foundation.h> 
@interface RandomGenerator : NSObject { 
    IBOutlet NSTextField *textField; 
} 
@end 
-------------- 
// RandomGenerator.m 
#import "RandomGenerator.h" 
@implementation RandomGenerator 
- (void)awakeFromNib { 
    [textField setStringValue:@"Insert a number between 1 and 100"]; 
} 
@end 

然後在AppDelegate的文件:

// GuessTheNumberAppDelegate.h 
#import <Cocoa/Cocoa.h> 
@interface GuessTheNumberAppDelegate : NSObject <NSApplicationDelegate> 
@property (assign) IBOutlet NSWindow *window; 
@end 
-------------- 
// GuessTheNumberAppDelegate.m 
#import "GuessTheNumberAppDelegate.h" 
#import "RandomGenerator.h" 
@implementation GuessTheNumberAppDelegate 
@synthesize window = _window; 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    RandomGenerator *random = [[RandomGenerator alloc] init]; 
    NSLog(@"%@",random); 
} 
@end 

構建和運行項目中,我得到你所期望的東西:

enter image description here

enter image description here

請注意,我不需要將RandomGenerator作爲IBOutlet連接,我只是確保它的頭包含在GuessTheNumberAppDelegate.h文件中。但請記住,喬希可能有一些更一般的想法,所以你可能仍然需要這樣做。

希望這會有所幫助!

+0

這幫助了很多,謝謝。 – 2012-02-26 22:44:04