0

次の関数と呼ばれるビューを見つけることができるかどうか疑問に思いました

- (void)viewWillAppear:(BOOL)animated {
  //find here the name of the calling view
}

新しいビューと呼ばれるビューを見つける方法はありますか?

4

4 に答える 4

2

viewWillAppearでは直接ではありません。UINavigationControllerにプッシュされている場合は、viewControllersを取得して前のものを取得できます。

if (self.navigationController){
NSArray* viewControllers = self.navigationControllers.viewControllers;
UIViewController* lastViewController = [viewControllers objectAtIndex:([viewControllers count] - 1)];
NSLog(@"%@ is my last ViewController before navigationg to this ViewController", lastViewController);
}
于 2012-11-19T16:36:40.650 に答える
1

これに使用できますpresentingViewControllerが、問題は、ポインタの名前ではなくビュー コントローラのメモリ アドレスを返すことです。

1 つの解決策は、表示しているビュー コントローラーのビュー プロパティにタグを割り当て、2 番目のコントローラーでそのタグを要求することです。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%i",[[[self presentingViewController] view] tag]);
}

最初のView Controllerで:

[[self view] setTag:(someNSInteger)];
于 2012-11-19T16:46:23.463 に答える
1

ナビゲーションコントローラーを使用している場合は、次によってプッシュされるviewControllerの配列を取得できます。

 NSArray *array =  self.navigationController.viewControllers;

ただし、これにより、プッシュされたビューコントローラーが得られます。ビューから戻ってきた場合、つまりナビゲーションスタックからポップされた場合は失敗します。

- (void)viewWillAppear:(BOOL)animated {
  //find here the name of the calling view
  }

が呼び出されます。

于 2012-11-19T16:40:34.003 に答える
0

言うまでもなく、「ビュー」はこれを呼び出しませんが、ビューが表示されたときに iOS がこれを呼び出します。残念ながら、これは複雑です。viewWillAppear他のビュー コントローラーがこのビュー コントローラーのビューを提示したことが原因で発生したり、このビューによって提示されたビュー コントローラーが閉じられたりポップされたりしたときに発生する可能性があるためです (モーダルとプッシュによって異なります)。

この問題を解決するためのあらゆる種類の洗練された複雑な方法を概説することはおそらく可能ですが、まず一歩下がって、なぜこれを行う必要があるのか​​を尋ねる必要があります. あなたは本当に何を達成しようとしていますか?ビュー コントローラ間の相互作用を調整しようとしているだけなら、はるかに優れた方法があります (たとえば、デリゲート、ビュー コントローラ プロパティの設定など)。


アップデート:

データが変更されたかどうかを把握しようとしている場合、「どこから来たのか」という論理に頼るのではなく、個人的には、データを変更するコントローラーまたはプロセスが通知の責任を負うメカニズムに傾倒します。この事実のコントローラーを表示します。

これを行う最も簡単な方法は、デリゲート デザイン パターンを採用することです。この場合、子ビュー コントローラーにはdelegate、データの変更を認識する必要があるコントローラーへのポインターであるプロパティがあり、子コントローラーはそのメソッドを呼び出すだけです。データが変更されたとき。もう少し複雑なシナリオでは、このデリゲート パターンを正式なデリゲート プロトコルと組み合わせることができます (そのため、子ビュー コントローラーは、特定のプロトコルに準拠しているという事実以外に、親コントローラーについて何も知る必要がありません)。よく知られている特定の 2 つのビュー コントローラ間で通信するだけの場合は、これは必要ないと言うかもしれません。委任を使用して他のコントローラーと通信するを参照してください。コントローラ プログラミング ガイドを表示します。

複雑な状況 (たとえば、データがさまざまな場所で変更されたり、Web サービスを介した更新中に非同期に変更されたりする場合など) では、通知デザイン パターンを使用します。特定の通知が によって送信されNSNotificationCenter、データが更新されるたびに、通知センターはその特定の通知を投稿するように指示され、オブザーバー (View Controller) によって受信されます。

于 2012-11-19T16:51:09.627 に答える