0

うまくいけば、これは簡単なものです...

複数の UIViewControllers で使用されるメソッドを持つ NSObject があります (NSObject は .pch ファイルにインポートされます)。

次に、UIViewControllers は NSObject を次のように呼び出します。

[ThisNSObject doSomething];

これはすべて計画どおりに機能しているため、問題はありません...ただし、どの UIViewController がその NSObject を呼び出したかを検出できるメソッド doSomething が欲しいです次に、その情報に基づいて、任意の方法で UIViewController を操作できます。

これが必要な理由は、各タブが異なる UIViewController をロードする UITabBar を持っているが、すべてがグローバル NSObject を呼び出している場合、その 1 つの特定の UIViewController にさらにアクションを指示する必要があるためです。

keyWindowにアクセスできることは知っていますが、これがまさに私が求めているものかどうかはわかりません。

どんな提案も素晴らしいでしょう、ありがとう。

ロイ

編集: 実際には、おそらく NSObject で現在選択されているタブを検出し、スタックの一番上のビューを取得して、そのような参照を作成できますか? なぜこれが悪い考えになるのか、誰にも考えがありますか?

4

2 に答える 2

1

@drekkaの答えにはある程度同意しますが、問題があります...コード行:

- (void) viewController:(UIVIewController*)viewController doSomething;

は構文的に正しくありません。ただし、彼は別の正しい解決策を提示することで、自分自身を償還しています。

- (void) doSomethingWithViewController:(UIViewController*) viewController;

別の方法として、ViewController を引数として渡すことが実際には意味をなさないと思われるため、カスタム クラスで委任を使用し、viewController を委任としてサブスクライブさせることもできます。例えば:

@protocol MyCustomNSObjectDelegate;

@interface MyCustomNSObject : NSObject

@property (nonatomic, assign) id<MyCustomNSObjectDelegate delegate;

- (void) doSomething;

@end

@protocol MyCustomNSObjectDelegate <NSObject>
@required
- (void) myCustomNSObject:(MyCustomNSObject*)myObject takeFurtherActionWithData:(NSString*)someData;
@end

次に、あなたの UIViewController で

#import "MyCustomNSObject.h"

@interface MyUIViewController : UIViewController <MyCustomNSObjectDelegate>

...

次に、doSomething を呼び出す前に、MyCustomNSObject のデリゲート プロパティを UIViewController に設定します。doSomething メソッドで、if が「何か」の実行を終了した後、メソッドの最後に次を追加します。

[self.delegate myCustomNSObject:self takeFurtherActionWithData:@"change this to whatever type you need here"];

お役に立てれば。

于 2012-04-10T04:05:14.860 に答える
0

ランタイム コードを使用すると、おそらくコール スタックを掘り下げることができますが、これは単純な問題に対するかなり複雑なソリューションです。インスピレーションを得るために API を参照し、doSomething メソッドを次のようなコントローラー引数を取るように変更することをお勧めします。

-(void) doSomethingWithViewController:(UIViewController *) viewController;

この方法で doSomething メソッドを使用できる場合、次のように self への参照を渡します。

[theObject doSomethingWithViewController:self];

そして、あなたの問題は解決されました - 簡単に。

PS他のパラメーターがある場合、代替の署名スタイルは

-(void) viewController:(UIViewController *) viewController doSomethingWithX:(id) x;

それはすべて、あなたにとって何が最も理にかなっているかにかかっています。

于 2012-04-10T02:12:55.867 に答える