2015-01-15 45 views
0

我有一個輔助窗口(面板),其中包含一個按鈕和一個包含一些標籤的框。我需要能夠更改框標題和標籤文本,但只能在AwakeFromNIB中這樣做。如果我在WindowDidLoad中檢查標籤的文本,它是零。 Init正在發射3次。不能更改輔助窗口面板中的標籤

// ExtendedCal.h 
#import <Cocoa/Cocoa.h> 
@interface ExtendedCal : NSWindowController 
@property (retain) IBOutlet NSTextField *lblCCW; 
@property (retain) IBOutlet NSTextField *lblCW; 
@property (nonatomic, retain) IBOutlet NSTextField *lblDegrees; 
@property (nonatomic, retain) IBOutlet NSBox *boxExtCal; 
@property (nonatomic, retain) IBOutlet NSButton *btnOK; 
@property (nonatomic, retain) NSString *maxSteps; 
@property (nonatomic) NSInteger arrayCtr; 
@property (nonatomic) NSInteger steps; 

- (IBAction)btnOKClicked:(id)sender; 
- (void)resetUI; 
@end 

// ExtendedCal.m 
#import "ExtendedCal.h" 
NSString * const myExtendedCalChangedNotification = @"MyExtCalKey"; 
NSString *const myExtendedCalEndedNotification = @"myExtCalEndedKey"; 
NSMutableArray *pointArray; 
NSInteger extCalStep; 
NSInteger extCalAxis; 
NSInteger extCalMin; 
NSInteger extCalMax; 

/* 
@interface ExtendedCal() 
@end 
*/ 

@implementation ExtendedCal 

@synthesize lblDegrees; 
@synthesize lblCCW; 
@synthesize lblCW; 
@synthesize btnOK; 
@synthesize boxExtCal; 
@synthesize maxSteps; 
@synthesize arrayCtr; 
@synthesize steps; 

- (id)init 
{ 
     self = [super initWithWindowNibName:@"ExtendedCal"]; 
     return self;  
} 

- (void)windowWillLoad 
{ 
    [lblDegrees setStringValue:@"MMM"]; /// does nothing 
} 
- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 
    NSInteger var1, ec, tmpI = 0; 
    steps = 0; 
    [self resetUI]; //does nothing when called from here 
    maxSteps = @"16"; 
    ec = 0; 
    pointArray = [NSMutableArray array]; 
    var1 = 0;  
    while (var1 <= extCalStep*25) 
    { 
     if (extCalMin == var1) 
     { 
      ec = 1; 
      [pointArray addObject:[NSNumber numberWithInteger:var1]]; 
     } 
     var1 = var1 + extCalStep; 
    } 
    if(ec==0) 
    { 
     ec = 1; 
     [pointArray addObject:[NSNumber numberWithInteger:extCalMin]]; 
    } 
    var1 = extCalStep; 
    tmpI = [pointArray count]; 
    while (var1 < extCalMax) 
    { 
     if (var1 > [[pointArray objectAtIndex:ec - 1]integerValue]) 
     { 
      ec +=1; 
      [pointArray addObject:[NSNumber numberWithInteger:var1]]; 
     } 
     var1 += extCalStep; 
    } 
    if(extCalMax > [[pointArray objectAtIndex:ec-1]integerValue]) 
    { 
     ec +=1; 
     [pointArray addObject:[NSNumber numberWithInteger:extCalMax]]; 
    } 
    tmpI = [pointArray count]; 
    arrayCtr = 0; 
    NSString *str = [[pointArray objectAtIndex:0]stringValue]; 

    [lblDegrees setStringValue:str];   //does nothing 
    NSString *s2 = [lblDegrees stringValue]; //s2 is nil 
} 

- (void)awakeFromNib 
{ 
    [lblDegrees setStringValue:@"888"]; //works from here 
    [self resetUI];      //works from here 
} 

- (void)btnOKClicked:(id)sender 
{ 
    extCalStep +=1; 
    NSMutableString *tmp; 
    NSString *option = @"160"; 
    tmp = [NSMutableString string]; 
    [tmp setString:@"Calibration-step "]; 
    [tmp appendFormat:@"%ld",extCalStep]; 
    [tmp appendString:@" of "]; 
    [tmp appendString:maxSteps]; 
    [boxExtCal setTitle:tmp];   //does nothing 
    option = [[pointArray objectAtIndex:arrayCtr] stringValue]; 
    option = [NSString stringWithFormat:@"0%ld", extCalStep]; 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    NSDictionary *userInfo = [NSDictionary 
       dictionaryWithObject:optionforKey:@"myExtCalKey"]; 
    [nc postNotificationName:myExtendedCalChangedNotification 
             object:self 
           userInfo:userInfo]; 
    steps++;  
} 

- (void)resetUI 
{ 
    NSMutableString *boxStr = [[NSMutableString alloc] init]; 
    [boxExtCal setTitle:@"Calibration step 1 of 16"]; 
    lblCW.hidden = NO; 
    lblCCW.hidden = YES; 
    [boxStr setString:@""]; 
    [boxStr appendString:@"999"]; 
    //[boxStr appendString:@"\u00B0"]; 
    [lblDegrees setStringValue:boxStr]; 
    steps = 0; 
} 

佈線

enter image description here

打開該窗口由

// ORSSerialPortDemoController.m 

#import "Calibrate.h" 
#import "ExtendedCal.h" 

Calibrate *calibrate; 
ExtendedCal *extCal; 
@interface ORSSerialPortDemoController() { 
} 
@end 
. 
. 
. 
[extendedcal showWindow:self]; 

回答

1

我認爲你的問題是你有兩個窗口控制器類的實例,ExtendedCal。您正在通過分配和初始化類創建一個代碼。我懷疑你也有一個在NIB本身實例化的。你幾乎證實了你的自我回答,你在NIB中提到了Extended Cal。

在代碼中創建的實例是加載NIB的實例。當您的-init方法調用super的-initWithWindowNibName:方法時,它將獲取傳遞給它的NIB名稱。當第一次請求window屬性時,它會加載NIB,這在-showWindow:的調用中是隱含的。

NSWindowController(或其子類)加載NIB時,它將自己作爲所有者傳遞。因此,NIB中的文件所有者佔位符解析爲該對象。另外,在該實例上調用-windowDidLoad方法。

由於您的NIB包含另一個ExtendedCal實例,因此在創建NIB時也會創建該實例。但是,它不是NIB的所有者,也沒有加載NIB。所以,這是-windowDidLoad方法不被調用。和它的任何連接(插座,綁定等)都不會連接到第一個實例。

擁有兩個具有不同角色的實例,其中一個具有調用的某些方法,另一個具有各種重要連接,這是混淆的根源。

更改此類連接以連接到文件所有者是解決方案的一部分,這是正確的。解決方案的其餘部分是完全從NIB中刪除ExtendedCal的實例。它不應該在那裏。窗口控制器在NIB之外。它是在NIB加載之前創建的,實際上是加載NIB的東西。因此,它不應該在NIB中實例化。

關於進一步的討論,我推薦這篇文章:https://www.mikeash.com/pyblog/friday-qa-2013-04-05-windows-and-window-controllers.html


哦,一些其他的東西:

-windowWillLoad被稱爲筆尖未加載。所以,沒有連接網點,並且lblDegrees預計爲nil

我建議避免在窗口控制器上實現-awakeFromNib-windowDidLoad是一個更好的選擇。 -awakeFromNib的問題在於它可以在某些情況下多次調用(例如,如果您的窗口控制器是基於視圖的表視圖的代表)。-windowDidLoad的語義和時間更簡單。

+0

我認爲你是正確的,但我不明白如何/從哪裏刪除從筆尖ExtendedCal實例化。重置網點似乎已經治癒了所有的弊病,但我可能會錯過一些東西。 – Mike 2015-01-18 13:33:45

+0

只需在NIB中的對象列表中選擇Extended Cal對象。您可能想要編輯器>顯示文檔大綱以使其更清晰。一旦選擇了對象,請執行編輯>刪除以將其刪除。 – 2015-01-18 18:32:50

+0

感謝您在製作答案和鏈接時的照顧。 – Mike 2015-01-19 11:55:34

0

改變了所有的網點從擴展到加州文件的所有者,除了窗口。