0

私の最初の iPhone アプリを作成し、別のクラス関数から 1 つのクラス関数にアクセスしようとしています。なぜこれが機能しないのですか?

基本的に、「DateViewController」と「inputMilesViewController」の 2 つのクラスがあります。「DateViewController」では、日付ポインターから日付を取得し、それを文字列に変換しました。これを「inputMilesViewController」の関数に送信し、そのシーン内のボタンのラベルを変更して、渡された文字列を表示します.

DateViewController.m に #import "inputMilesViewController.h" と入力しました

[inputMilesViewController changeButtonText:msg];

*「セレクター 'changeButtonText:' の既知のクラス メソッドがありません」というエラー メッセージが渡されません。

inputMilesViewController.m には次のものがあります...

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

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

今のところ、実際にテキストを変更することにはあまり関心がなく、この NSLog を印刷することさえ試みているだけなので、関数に入ることができます。

4

1 に答える 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 で依存性注入を処理する良い方法は、「デリゲート」または「データソース」の概念を使用することです。(これがすべてあなたにとって馴染みのあるものであることを願っています。そうすれば、優れた設計への道を見つけることができます)。

もう 1 つの方法は、通知センターを使用することです。メッセージを に直接送信する代わりにinputMilesViewController、通知センターを介して送信します。このソリューションにより、2 つのクラス間の結合が低くなります。この投稿では、それを実装する方法の説明を見つけることができます。

編集:

+クラス自体ではなく、クラス インスタンスに実際にアクセスする必要があるため、(の代わりに)クラス メソッドを呼び出す-ことは解決策になりません。クラス メソッドは、たとえば、クラスのすべてのインスタンスが共有する静的データがある場合に適しています。この場合、画面上の一部のビューをバックアップするためにインスタンス化されたコントローラーがあります。そのビューにはいくつかのボタンがあり、そのテキストを変更したいとします。これはすべて、本質的にインスタンス レベルで定義されます。クラス メソッドとインスタンス メソッドの違いについては、この投稿をご覧ください。

2 つのコントローラー間の通信に適切に対処するために、上で説明した方法のいずれかを解決することをお勧めします。これは非常に一般的な問題であるため、プログラミング プロジェクト全体で何度も対処する必要があります。1つを手に取って詳細を知りたい場合は、それを求めてください.

于 2012-11-04T21:57:07.947 に答える