2014-09-24 19 views
1

叫我嘗試調用一個IBOutlet,這是從另一個類一個Singleton對象的屬性,但它返回零。我讀過很多關於單身人士的其他帖子,但似乎有些東西我缺少。這是一個OSX問題。辛格爾頓IBOutlet中從另一個類返回nil

在Interface Builder中我有一個按鈕和一個單身的對象設置爲自定義類。 Singletons類被稱爲「CEOptionsST」。該按鈕作爲IBOutlet連接到Singleton的類別標題。
@property (weak) IBOutlet NSButton *mybutton;

後來我想從另一個類訪問按鈕的狀態。因此我打電話給:

CEOptionsST *opt = [CEOptionsST sharedOptions]; 
    NSLog(@"state: %ld",(long)[[_opt mybutton] state]); 

無論按鈕是打開還是關閉,總是返回0。使用文本域而不是按鈕返回nil。

指針是相同的登錄時self從Singleton's和opt內部。所以Singleton並沒有實例化兩次。 當我在調試模式下檢查opt時,它告訴我所有的屬性都是零。 IBOutlet屬性「mybutton」爲零。所以由Interface Builder(或nib)啓動的Singleton對象與opt相同,但mybutton和其他屬性的狀態不可訪問 - 我在想什麼?

什麼我正嘗試實現是有UI控件「選項」對於用戶來說,這是整個應用程序進行訪問。
Here's我的Singleton類(由Dave DeLong's answer):

@interface CEOptionsST : NSObject 
    + (id) sharedOptions; 
    @property (weak) IBOutlet NSButton *mybutton; 
    @end 

    @implementation CEOptionsST 

    + (void)initialize{ 
     [self sharedOptions]; 
    } 

    + (id)sharedOptions { 
     static CEOptionsST *sharedOptions = nil; 
     static dispatch_once_t onceToken; 
     dispatch_once(&onceToken, ^{ 
      sharedOptions = [[self actualAlloc] initActual]; 
     }); 
     return sharedOptions; 
    } 

    + (id)actualAlloc { 
     return [super alloc]; 
    } 

    + (id)alloc { 
     return [CEOptionsST sharedOptions]; 
    } 

    - (id)initActual { 
     self = [super init]; 
     if (self) { 

     } 
     return self; 
    } 

    - (id)init { 
     return self; 
    } 

    - (id)initWithCoder:(NSCoder *)decoder { 
     return self; 
    } 

感謝, 托馬斯

回答

0

myButton對象可以被釋放,因爲只有你的單指向NSButton。您應該嘗試將參考類型從weak更改爲strong

你的錯誤的另一個可能的原因可以連接到IBOutlet和辛格爾頓。說實話,我從來沒有見過這樣的組合,根據蘋果指南,這可能不是一個好的做法。請嘗試刪除IBOutlet並以編程方式設置NSButton

1

我強烈建議你重新考慮你的應用程序的架構!無論如何,也許你可以在nibs中通過allocWithZone找到你的「答案」:不要alloc,試着重寫那個來調用你的sharedOptions類的方法。

+0

使用allocWithZone:沒有幫助。但我非常樂意提供有關如何有效地將用戶界面按鈕或文本字段值傳遞給其他需要數據的類的建議。使用單例看起來像一個簡單的解決方案。 atm我正在使用應用程序委託類讀取iboutlet值,並將值傳遞給單例,以便其他類可以訪問它們。我認爲將插座直接連接到單身人士會更容易。 – 2014-09-25 13:34:13