2012-11-04 144 views
0

我正在做我的第一個iPhone應用程序,並試圖從另一個類函數訪問一個類函數。爲什麼這不起作用?從另一個類函數調用一個類函數

基本上我有兩個類,「DateViewController」和「inputMilesViewController」。在「DateViewController」中,我從日期指針中取出一個日期,並將其轉換爲一個字符串,我想將它發送給「inputMilesViewController」中的一個函數,該函數將更改該場景中按鈕上的標籤以顯示傳入的字符串。

在DateViewController.m我已經#進口「inputMilesViewController.h」 進入我試圖做

*我不能獲得通過的錯誤消息「沒有已知的類方法的選擇‘changeButtonText:’

inputMilesViewController.m具有以下...

-(void) changeButtonText:(NSString*) dateStringForInput{ 

NSLog(@"we got to changebuttontext"); 
    //[_myTodayButton setTitle:dateStringForInput forState:UIControlStateNormal]; 
} 

現在我不太關心實際上改變文本,我只是想要打印這個NSLog,所以我知道我可以進入函數。

+0

最好有一個簡短的標題。也請不要使用簽名等。 –

+1

在錯誤的含義對你有意義之前,你需要理解類和對象之間的區別。 –

回答

2
[inputMilesViewController changeButtonText:msg]; 

*我不能獲得通過的錯誤消息「沒有已知的類方法的選擇‘changeButtonText:’

你發送消息到類而不是該類的一個實例。這就解釋了這個問題

解決這個問題的方法是讓一個控制器知道另一個控制器,這樣就可以將消息發送給控制器的已知實例,這可以通過一種稱爲「依賴注入「,其中簡單地說就是說你將一個對你的inputMilesViewController實例的引用「注入」到另一個控制器中,以便後者可以向前者發送消息。

例如,您可以將指向inputMilesViewController實例的指針傳遞給DateViewController的初始化方法。

@interface DateViewController 
... 
@property (nonatomic, retain/strong) inputMilesViewController* inputMilesController; 
... 
- (id)initWithInputMilesViewController:(inputMilesViewController*)controller; 
... 
@end 

@implementation DateViewController 
... 
    [self.inputMilesController changeButtonText:msg]; 
... 
@end 

或者你可以簡單地DateViewController定義屬性,並在適當的時候將其值設置(即,在調用dateStringForInput之前)。

在Objective-C中處理依賴注入的好方法是通過「委託」或「數據源」的概念。 (我希望這一切聽起來很熟悉,所以你可以找到一個好的設計方式)。

另一種方法是使用通知中心,因此您不需要直接向inputMilesViewController發送消息,而是通過通知中心發送消息。該解決方案確保了兩個類之間的較低耦合。 在this post中,您可以找到如何實現它的說明。

編輯:

調用類方法(+而不是-)不能是解決方案,因爲你想真正進入類的實例,而不是類本身。一個類的方法是好的,當你有,例如,該類共享的靜態數據即所有實例。在這種情況下,你有一個控制器被實例化來備份屏幕上的一些視圖;該視圖中有一些按鈕,並且您想要更改其文本。這一切都是在實例級固有定義的。 看看這篇文章,瞭解有關difference between class and instance methods的說明。

我的建議是爲您制定出上述方法之一,以正確解決兩個控制器之間的通信問題。這是一個普遍的問題,您必須在整個編程項目中反覆處理它。如果你拿起一個,並希望有更多的細節,只需要它。

+0

感謝大家的幫助。我試着將「 - (void)changeButtonText:(NSString *)dateStringForInput {」轉換爲「+(void)changeButtonText:(NSString *)dateStringForInput {」,現在它似乎沒有問題。但現在我發現自己有這個問題 - http://stackoverflow.com/q/13223847/1798729 –

+0

請參閱我的編輯。不幸的是,調用類方法不是解決方案。 – sergio