1

複数のviewControllerを持つアプリがあり、これらのviewControllerの一部にはさまざまなタスクを実行するメソッドが含まれています。私がする必要があるのは、最初のviewControllerがロードされたときに、バックグラウンドで実行されるように他のviewControllerでこれらのメソッドを呼び出すことですが、これを行うのにいくつかの問題があります。

4つのviewController、A、B、C、およびDがあるとします。ここで、Aは最初のviewControllerであり、各viewControllerには、それぞれaMethod、bMethod、cMethod、およびdMethodがあります。関連するコードは次のとおりです。

私の最初のviewController(AviewController)の内部:

.hファイル内:

#import "BViewController"
#import "CViewController"
#import "DViewController"

@interface AViewController:UIViewController {

BViewController *bViewCon;
CViewController *cViewCon;
DViewController *dViewCon;


}

@property (nonatomic, retain) BViewController *bViewCon;
@property (nonatomic, retain) CViewController *cViewCon;
@property (nonatomic, retain) DViewController *dViewCon;

@end

私の.mファイルには次のものがあります。

#import "BViewController"
#import "CViewController"
#import "DViewController"

@implementation AviewController

@synthesize bViewCon, cViewCon, dViewCon;

- (void) viewDidLoad {

[super viewDidLoad];

bViewCon = [[BViewController alloc] init];
[bViewCon bMethod];

...

}

ただし、「「BViewController」の表示された@interfaceがセレクター「bMethod」を宣言していません」というエラーメッセージが表示されます。このクラス(つまりAViewController)と同じ方法で、他のviewControllerから他のメソッドを呼び出す必要があります。

返信してくださった皆様、ありがとうございました。

4

2 に答える 2

5

使用を検討しましたNSNotificationCenterか?通知にメソッドを設定し、実行する必要があるときにpingを実行します。これは、ナビゲーションコントローラースタックや別のタブに埋め込まれているなど、他のビューコントローラーがインスタンス化されて使用可能である場合に役立ちます。

そのエラーに関する質問に答えるには、ヘッダーファイルで呼び出したいメソッドを宣言する必要があります。エラーは、そのメソッドの宣言が見つからないことを示しています。

通知センターの例

// listen for notifications - add to view controller doing the actions
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mySpecialMethod) name:@"SomeNotificationName" object:nil];

// when you want your other view controller to do something, post a notification
[[NSNotificationCenter defaultCenter] postNotificationName:@"SomeNotificationName" object:nil];

// you don't want this notification hanging around, so add this when you are done or in dealloc/viewDidUnload
[[NSNotificationCenter defaultCenter] removeObserver:self]; // this removes all notifications for this view
// if you want to remove just the one you created, you can remove it by name as well
于 2013-01-02T22:40:05.910 に答える
1

受け取ったエラーを解決するには、すべてのメソッドが各コントローラーのヘッダー(.h)ファイルで宣言されていることを確認してください(そうでない場合、コンパイラーはそれらを認識できません)。

これらのコントローラーはすべて子であるためAViewController(これらはivarによって作成されAViewController、ivarとして保持されます)、NSNotificationCenterここでは使用しません(特定のイベントが発生した場合に通知する必要のある他のオブジェクトがない限り、そうではありません)。が所有AViewController)。

代わりに、あなたがやろうとしているように、私はメソッドを直接呼び出すだけです。

別の注意点として、これらのメソッドが進行中のタスクを開始している(バックグラウンドでタスクを実行している)場合は、メソッド呼び出しをのinit:メソッドに移動するのが最適な場合がありAViewControllerます。(iOS 5と同様に、ビューはアンロードviewDidLoad:できるため、メモリ警告やビューが画面外にある場合など、複数回呼び出される可能性があります)。私はこのようなことをするかもしれません:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:nibName bundle:bundle];  // your correct stuff here
    if (self)
    {
         bViewCon = [[BViewController alloc] init];
         [bViewCon bMethod];
         // ... and so on for the other controllers
    }
    return self;
}

編集

コメントで述べたように、UIViewControllersはメモリの点で正確に安価ではありませんが、正直なところ、このコードをリファクタリングして、単一のコントローラー(より安価なのNSObject代わりにのサブクラス)を使用するのが最善の方法です。UIViewControllerバックグラウンドで実行される予定のタスクのマネージャー。これは、各コントローラーのタスクと目的を区分化するのに役立つため、後で役立つ可能性が高いと思います(そのため、UIViewControllersは主にビュー(場合によっては/ビュー階層)の管理を担当し、関連付けられますタスク...上記のビューに関連するものの範囲外で発生している進行中のタスクがある場合、それはおそらくUIViewControllerそれらを処理するべきではないという兆候です...

于 2013-01-02T22:55:13.977 に答える