2012-08-23 37 views
2

我已經通過Interface Builder創建了一個NSMenu。一位名爲showPreferencesPanel方法的菜單項,這是在KBAppController.m定義的:@selector - 如何從另一個類調用方法?

-(void)showPreferencesPanel { 
    //something 
} 

現在,我必須重新建立一個沒有IB的菜單......所有程序。 StatusMenu.m是處理所有這些的類,我無法弄清楚我應該設置的目標,以便從另一個類中調用方法。

創建該類的實例不起作用!菜單項灰顯。

StatusMenu.m

KBAppController *kbAppController = [[KBAppController alloc]init]; 
NSMenuItem* preferencesItem; 
[preferencesItem setTarget:kbAppController]; 
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""]; 

編輯:------------------------------- ------------

這裏是使用KBAppController類的對象的更新代碼。好消息是,首選項菜單項已啓用,但它仍然沒有調用該方法在KBAppController.m :(

KBStatusMenu.m

@synthesize kbAppController = _kbAppController; 

someMethod { 
NSMenuItem* preferencesItem; 
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""]; 
[preferencesItem setTarget:self]; 
} 

- (void)showPreferencesPanel { 
NSLog(@"in 1"); 
[_kbAppController showPreferencesPanel]; 
} 

KBAppController.m

-(void)showPreferencesPanel { 
    NSLog(@"in 2"); 
    //something 
} 
+0

這是否打印出任何東西? –

+0

是的,它達到了「1」,但從來沒有「2」。 _kbAppController爲空!我刪除了屬性和@synthesize語句,現在它可以工作。 – janeh

回答

0

selector已從您的班級調用該方法。在該方法中,請撥打showPreferencePanel()KBAPPController的對象。

確保將KBAppController的對象設置爲StatusMenu的屬性。

+0

謝謝,我編輯我的問題,包括新的代碼。它仍然不會調用另一個類的方法。我在哪裏搞亂? – janeh

+0

在'showPreferencesPanel'中設置了一個斷點,並確定'_kbAppController'是否不爲零 – Legolas

+0

ok,我創建了一個KBAppController的實例,並且我沒有將它設置爲屬性。我刪除了@synthesize,現在它正在工作。雖然我不明白爲什麼它不能作爲財產運作,但我很困惑。 – janeh

1

NSMenuItem有- (void)setTarget:(id)anObject- (void)setAction:(SEL)aSelector應該做的伎倆。

只要確保您先設置並初始化NSMenuItem。現在你在未初始化的對象上調用-setAction

preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""]; 
[preferencesItem setTarget:kbAppController] 
相關問題