1

「所有」クラスのメソッドを呼び出す方法はありますか? (オブジェクトを作成したクラス)。

状況は次のとおりです。私のアプリはUIScrollView. タッチ イベントを処理する必要があるため、UIScrollView直接使用する代わりに、それをサブクラス化し、代わりに MyScrollView を使用します (touchesEnded:メソッドを実装できるようにします)。View Controller クラスに MyScrollView のインスタンスが作成されます。ここで私の質問が出てきます。touchesEnded:(MyScrollView.m の) メソッド内で、View Controller クラスからメソッドを呼び出したいと考えています。これを行う直接的な方法はありますか?何かのようなもの:

[owner myMethod];

私が今行っている方法は、MyScrollView.m 内に MyViewController.h を含めて、そのインスタンスを作成することです。

MyViewController *controller;
[controller myMethod];

正しくないようです。洞察はありますか?

4

2 に答える 2

3

もう少し調査した結果、UIScrollView にはデリゲート プロトコルが組み込まれていることがわかりました。つまり、サブクラス化する必要はまったくありません。

ビュー コントローラーのヘッダー ファイルで、次の行を見つけます。

@interface MyViewController : UIViewController {

それを次のように変更します。

@interface MyViewController : UIViewController <UIScrollViewDelegate> {

Interface Builder を使用していると仮定して、それを開いてスクロール ビュー オブジェクトを見つけます。それを選択し、接続インスペクターを開き、「デリゲート」アウトレットをView Controllerに接続します。Xcode に戻り、View Controller の実装ファイルを開きます。メソッドを追加します。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
      NSLog(@"Here is where you do whatever it is that you're trying to do!");
}

それだけです。さらに明確にする必要がある場合はお知らせください。

私の答えの以前のバージョン:

これを行う最善の方法は、デリゲート システムを使用することです。スクロールビューには次のようなプロパティがあります。

@property(nonatomic,assign) id<MyScrollViewDelegate> delegate;

次に、デリゲートのプロトコルを次のように定義できます。

@protocol MyScrollViewDelegate <NSObject>
- (void)methodName;
@end

注: プロパティ行の前にデリゲートへの前方参照を置き、その後でメソッドを定義する必要があります。それの前方参照はただ @protocol MyScrollViewDelegate;.

ビュー コントローラーのヘッダー ファイルで、スクロール ビューのヘッダーをインポートしてから、オブジェクトの親クラスを から に変更し UIViewControllerUIViewController <MyScrollViewDelegate>ください。

次に、ビュー コントローラーでスクロール ビューを作成するときに、そのデリゲート プロパティを に設定します (UI を作成する方法である場合は、Interface Builder でこれを行うことができます。その場合、型の前selfに必ずIBOutlet キーワードを追加してください。idあなたの @property。)

最後に、スクロール ビューからビュー コントローラーを呼び出すには、次のコードを実行します。

[self.delegate methodName];

以上です!

于 2011-01-15T18:40:28.273 に答える
1

まず第一に、数か月前の質問でも受け入れ率が 0% というのはひどすぎます。今後の質問に回答してもらえる可能性が高くなるように、できるだけ早く修正する必要があります。

使用しているプログラミング言語について言及していなくても、OO パラダイムでは、何かをしない限り、オブジェクトの作成者に対処する方法はありません。

解決策 1

可能であれば、コンストラクターが、クラスの新しいインスタンスを作成するオブジェクトによってthisとして渡されるCreatorまたはparentパラメーターを受け入れるようにします。作成者と作成者を完全に制御する必要があります。

解決策 2

あなたのケースには100%適していないかもしれませんが、それが工場のパターンです。一般に、ファクトリはシングルトン クラスであるため、ファクトリによって作成されたすべてのオブジェクトには、ファクトリのインスタンスにアクセスする手段が必要です。溶液 1 と混合することができます。

解決策 3

反射。プログラミング言語によっては、コンストラクターが呼び出されたときに、スタック トレースを分析して、メソッドを呼び出したオブジェクトへの参照を取得しようとする場合があります。

解決策 4

コンテナパターンを採用。作成者の概念をあきらめることができる場合は、少なくとも WinForms と WebForms が行うように、コントロールを他のコントロールのコンテナーと見なすことできます。したがって、コンテナー オブジェクトから含まれているすべてのオブジェクトへの二重参照と、後方参照 (特定のセッター メソッド/*property* を使用してコンストラクターの後に設定) があります。そのため、自分のオブジェクトを作成したオブジェクトへの参照ではなく、自分のオブジェクトを含むオブジェクトへの参照が作成されます。繰り返しますが、コードを完全に制御する必要があります。

私があなただったら、解決策 1 または 4 を選びます

[編集]: 私が最初に回答を書いたとき、あなたが Objective-C を使用しているとは読めませんでした。私はその専門家ではありません。より良い解決策があるかどうかはわかりませんが、私のもの(おそらく3を除く)は実行可能です

于 2011-01-15T18:34:52.517 に答える