ビュー1のクラスメソッド内からルートビューに戻りたいのですが、ビュー1のインスタンスメソッドでは、次のように言います。
[self.navigationController popViewControllerAnimated:YES];
しかしself
、クラスメソッドには適用されないので、これをどのように実現するのか疑問に思っています。下の図に関連して、私は現在View1Controller.mのクラスメソッドを使用しており、Rootviewに戻りたいと思います。ありがとう。
ビュー1のクラスメソッド内からルートビューに戻りたいのですが、ビュー1のインスタンスメソッドでは、次のように言います。
[self.navigationController popViewControllerAnimated:YES];
しかしself
、クラスメソッドには適用されないので、これをどのように実現するのか疑問に思っています。下の図に関連して、私は現在View1Controller.mのクラスメソッドを使用しており、Rootviewに戻りたいと思います。ありがとう。
別のメソッドを宣言できます。
-(void)closeThisViewController
{
[self.navigationController popViewControllerAnimated:YES];
}
次に、NotificationCenterを使用します。
[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_closeThisVC" selector:@selector(closeThisViewController) object:nil];
jonkrollが言ったように、あなたはView Controllerのものを扱っていますが、なぜViewController関連のコードをクラスメソッド内に置くのか理解できません。
上記の悪いコードでごめんなさい。
NSNotificationCenterを使用して通知を投稿できるという意味です。
-(void)postNotificationName:(NSString *)notificationName object:(id)notificationSender
次に、同じビューコントローラでNSNotificationCenterオブザーバを宣言します。
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
私の脳は指よりも速かったので、解決策を説明しようとしたときに、2つを1つにまとめました:P
それはもっとこのようになるはずです:
// posting a notification with NSNotificationCenter
[[NSNotificationCenter defaultCenter] postNotificationName:@"notif_closeThisVC" object:nil];
viewDidLoadメソッドのどこかに(上部をお勧めします)、次を追加します。
-(void)viewDidLoad
{
// adding an observer with NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeThisViewController) name:@"notif_closeThisVC" object:nil];
...
}
お役に立てば幸いです。
これをクラスメソッドからインスタンスメソッドにリファクタリングしたくない場合(そして、それを望まない場合も確かにあります)、クラスメソッドに完了ブロックパラメーターを追加することをお勧めします。
+ (void)doSomethingWithCompletion:(void(^)())completion {
/* Do your thing... */
completion();
}
- (IBAction)doSomething:(id)sender {
[self.class doSomethingWithCompletion:^{
[self.navigationController popViewControllerAnimated:YES];
}];
}
これにより、クラスメソッドが実行するインスタンスのない操作と、ViewControllerのインスタンス固有の却下を明確に分離できます。操作が失敗する可能性がある場合は、完了ブロックにエラーオブジェクトを受け入れさせることもできます。
デリゲートオブジェクトを使用して、またはView Controllerを渡して閉じることで同様のことを行うことができますが、このデザインは、最もモダンな感触で最もクリーンな分離を提供しているようです。
現在のViewControllerにアクセスし、を介してNavigation Controllerにアクセスできるように、リファクタリングを推奨する正当な議論がありますcurrentVC.navigationController
。それでもクラスメソッドである可能性があることを忘れないでください。VCから呼び出す(または呼び出す呼び出しチェーンを開始する)ときに、追加の引数を指定するだけです。
ただし、アプリの1つでもこれを解決する必要があったため、ナビゲーションコントローラーが、常にポインター( "weak ref")を介してすべてのユーザーがグローバルにアクセスできることを確認しました。
このようにグローバル変数を宣言する場合(たとえば、「Navigation.h」で)
extern UINavigationController *gNavController;
そしてそれをあなたの中で定義しますAppDelegate.m
(あなたがそれについて錆びているなら、宣言/定義の間の区別をレビューするために支払います):
UINavigationController* gNavController;
そして、起動時にそれを割り当てますapplication:didFinishLaunchingWithOptions:
:(デリゲートがviewController
ナビゲーションコントローラーであるというプロパティを持っていると仮定します):
gNavController = viewController;
そうすれば#import Navigation.h
、あなたはいつでもナビゲーションコントローラーにアクセスできます。これにより、ポップアップ/ポップオーバーのビューへのハンドルの取得もはるかに簡単になります。これはまた、navコントローラーがアプリの存続期間中リリースされないことを前提としています(何か異常なことをしている場合を除いて、おそらく本当です)。