これを行う方法は次のとおりです。しかし、私はあなたがそれをすべきでない理由を説明するためにこれを本当に投稿しています。
- VC2とVC3のviewtagプロパティを使用して、ナビゲーションデータを渡します。これは、3つのオブジェクトすべてを緊密に結合する効果があります。
- VC1->VC3コンテキストの戻るバーボタンをオーバーライドします。一貫性が失われます。
- VC3->VC2はバックアニメーションを提供します。VC3-> VC1は、あるタブから別のタブに反転するため、アニメーションはありません。より多くの矛盾
- VC1-> VC3で、[タブ項目2]をタップしてVC2に移行します。UIの混乱。
とにかく、あなたがまだこれをしたいのなら...。
ViewController1
「VC3にジャンプ」ボタンがあり、jumpToVC3に接続します。
//ViewController1.m
#import "ViewController1.h"
@implementation ViewController1
- (IBAction)jumpToVC3:(id)sender {
NSArray* viewArray = [[[self.tabBarController viewControllers] objectAtIndex:1] viewControllers];
[[[viewArray lastObject] view] setTag:1];
[self.tabBarController setSelectedIndex:1];
}
@end
「jumptToVC3」はタブ2に切り替え、最前面のビューのビュータグプロパティを1に設定します。最前面のビューがVC2の場合、これによりVC3への即時セグエがトリガーされます。最前面のビューがVC3の場合、これにより戻るボタンが正しく設定されます。他のViewControllerがこのスタックに追加されると、このナビゲーションは機能しなくなります。
ViewController2
には、VC3「toVC3」へのストーリーボードセグエに配線された「movetoVC3」ボタンがあります
// ViewController2.m
#import "ViewController2.h"
#import "ViewController3.h"
@implementation ViewController2
//we use the view.tag property as a switch:
//0 = do nothing
//1 = segue to VC3
//2 = go to tab 0
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.view.tag ==1){
[self performSegueWithIdentifier:@"toVC3" sender:self];
} else if (self.view.tag == 2){
[self.tabBarController setSelectedIndex:0];
}
self.view.tag = 0;
}
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if (self.view.tag ==1) {
[[segue.destinationViewController view] setTag:1];
} else {
[[segue.destinationViewController view] setTag:0];
}
self.view.tag = 0;
}
- (void) viewWillDisappear:(BOOL)animated
{
self.view.tag = 0;
}
@end
ViewController3
view.tagが1に設定されている場合、戻るボタンをオーバーライドします。両方のコンテキストの戻るボタンを一貫させたい場合は、デフォルトの動作もオーバーライドする必要があります。このオーバーライド動作の標準の戻るボタンの外観を取得することはできません。
// ViewController3.m
#import "ViewController3.h"
@implementation ViewController3
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.view.tag == 1) {
self.navigationItem.leftBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"0.0"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(goBack:)];
}
self.view.tag = 0;
}
- (IBAction)goBack:(id)sender {
[[[[self.navigationController viewControllers]
objectAtIndex:0] view] setTag:2];
[self.navigationController popToRootViewControllerAnimated:YES];
}
@end