2011-01-11 19 views
0

在過去的幾個星期裏,我終於從常規C進入Obj-C並開始了我的第一個應用程序。我看過教程並通讀了一本書以及很多網頁,但我知道我只是剛剛開始。無論如何,在今天早上的大部分時間和今天上午,我一直試圖讓這段代碼起作用,現在它會編譯,我有一些警告。我已經搜索並發現類似的解決方案問題,但仍然沒有骰子。我想要做的是將一個由txt文檔組成的數組放入組合框的彈出列表中。「'對象'可能無法響應'函數'」警告

AwesomeBoxList.h:

#import <Cocoa/Cocoa.h> 
@interface AwesomeBoxList : NSObject 
{ 
    IBOutlet NSComboBox *ComboBoz; 
} 
-(NSArray *) getStringzFromTxtz; 
- (void) awesomeBoxList; 
@end 

AwesomeBoxList.m:

#import "AwesomeBoxList.h" 

@implementation AwesomeBoxList 

-(NSArray *)getStringzFromTxtz 
{ 
... 
return combind; 
} 

- (void) awesomeBoxList 
{ 
[ComboBoz setUsesDataSource:YES]; 


[ComboBoz setDataSource: 

[ComboBoz getStringzFromTxtz]: //'NSComboBox' may not respond to 'getStringzFromTxtz' 

[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex: 

[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]]; 


     /*'NSComboBox' may not respond to '-numberOfItemsInComboBox:' 
    'NSComboBox' may not respond to '-comboBox:objectValueForItemAtIndex:' 
    'NSComboBox' may not respond to '-setDataSource:' 
    */ 
} 

@end 

因此,所有這些錯誤,我的OBJ-C的尚淺的知識,我必須做出某種n00b錯誤。

感謝您的幫助。

回答

1

這裏似乎有一個大量的混淆,主要表現在你最後的代碼行中( (4))。您知道':'符號用於將參數傳遞給方法,而不是終止一行?你基本上是用最終的4條線將菊花鏈連接在一起,這是毫無意義的。至於具體的警告,getStringzFromTxtz是你在AwesomeBoxList上定義的方法,而不是NSComboBox的方法。 numberOfItemsInComboBox:和comboBox:objectValueForItemAtIndex:是NSComboBoxDataSource Protocol方法,打算由您的類代表NSComboBox而不是NSComboBox方法實現。我建議在代表和協議上做一些閱讀。

詳細說明: 爲了讓您的AwesomeBoxList類使用NSComboBox,它需要向組合框提供信息給組合框需要知道。在Apple Universe中,像這樣的情況通常由Delegate Design Pattern處理。具體而言,組合框需要知道它將顯示多少項目以及對於每個所示項目的對象表示。組合框聲明在NSComboBoxDataSource Protocol中執行此操作的界面。通過提供這些信息,您可以充當組合框的數據源。你可以告訴組合框,它應該通過設置自己作爲在Interface Builder其DataSource屬性或將呼叫從某處你AwesomeBoxList的實現推遲到您的類將其數據

[ComboBoz setDataSource:self]; 

。這將確保組合框調用你的類中的方法來使用信息填充自己。有兩種方法具體,你的AwesomeBoxList類應該實現,而且可以通過組合框被稱爲:

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { 
    switch (index) { 
     // Return some object that is represented by index in the combo box 
    } 
} 

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox { 
    // return theNumberOfItemsInYourComboBox; 
} 

提供了一個有意義的實現是所有你需要做的,用數據填充您的組合框。我不知道你想要的具體細節,但這是你想要遵循的模式。希望能有所幫助。

+0

是的,我知道「;」之間的區別,和':',文檔說你需要使用comboBox:objectValueForItemAtIndex:和numberOfItemsInComboBox:來使用setDataSource :,我注意到第二個方法返回一個int並且第一個接受一個int,所以我認爲這就是他們合在一起的方式。你說得對,因爲NSComboBoxDataSource協議是非正式的,我需要更多地瞭解委託和協議,我該如何使用它,以便這些方法有效?感謝您的幫助。 – Andrew 2011-01-11 22:40:37

0

那麼,getStringzFromTxtz將無法發送到NSComboBox實例,因爲該方法是在AwesomeBoxList類中聲明和定義的。在運行時不會找到此方法。另外,我認爲你可能需要圍繞委託和數據源開始 - 其他方法是NSComboBoxDataSource協議的一部分。有關示例,請參閱文檔中的「組合框編程指南」。

0

這些方法不存在。 See the NSComboBox documentation for more information.

相反的:

 
[ComboBoz 
comboBox:(NSComboBox *)ComboBoz 
objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]; 

嘗試:

 
[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1]; 

此外,請注意,該平臺的慣例是在伊娃的開頭使用小寫字母。

相關問題