[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つを手に取って詳細を知りたい場合は、それを求めてください.