「「オブジェクト」は「関数」に応答しない場合があります」警告
-
09-10-2019 - |
質問
ここ数週間、私はついに通常の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の間違いを犯している必要があります。
助けてくれてありがとう。
解決
ここでは、一般的に大量の混乱があるように見えますが、ほとんどがコードの最後の(4)行に現れています。 ':'シンボルは、行を終了するのではなく、メソッドに引数を渡すために使用されることを知っていますか?あなたは本質的にデイジーがそれらの最後の4行を一緒に連鎖させています。特定の警告に関しては、getStringzfromtxtzは、nscomboboxの方法ではなく、ashoughboxListで定義した方法です。 numberofitemsincombobox:およびcombobox:objectvalueforitematindex:are nscomboboxdatasourceプロトコル NSComboBoxメソッドではなく、NSComBoBoxに代わってクラスによって実装されることを目的とした方法。代表者とプロトコルを少し読むことをお勧めします。
詳しく説明するために、AwesomeBoxListクラスがNSComboBoxを使用するためには、コンボボックスに情報をコンボボックスに提供する必要があります。リンゴの世界では、このような状況は通常、 デザインパターンを委任します. 。具体的には、コンボボックスを知る必要があります 表示されるアイテムの数 と同様 表示されている各アイテムのオブジェクト表現. 。コンボボックスは、これを行うためにインターフェイスを宣言します nscomboboxdatasourceプロトコル. 。この情報を提供することにより、コンボボックスのDataSourceとして機能しています。コンボボックスに、インターフェイスビルダーのデータソースプロパティとして自分自身を設定するか、電話をかけることにより、データのためにクラスに延期する必要があることを伝えることができます。
[ComboBoz setDataSource:self];
AwesomeBoxListの実装のどこかから。これにより、コンボボックスがクラスのメソッドを呼び出して情報を入力します。 AwesomeBoxListクラスが実装する必要がある2つの方法があり、コンボボックスで呼び出されます。
- (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;
}
コンボボックスにデータを入力するために必要な意味のある実装を提供するだけです。私はあなたがここで欲しいものの詳細を知りませんが、それはあなたが従いたいパターンです。それがもう少し役立つことを願っています。
他のヒント
さて、GetStringZfromTxtzは、その方法が宣言され、AwesomeBoxListクラスで定義されているため、NSComboBoxインスタンスに送信されることはありません。この方法は実行時には見つかりません。
また、代表者やデータソースの周りに頭を導く必要があるかもしれないと思います - 他の方法はNSComboBoxDataSourceプロトコルの一部です。例については、ドキュメントのコンボボックスプログラミングガイドをご覧ください。
これらの方法は存在しません。 詳細については、nscomboboxドキュメントを参照してください。
それ以外の:
[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]];
試す:
[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1];
また、プラットフォーム規則は、IVARの開始時に低ケースの文字を使用することであることに注意してください。