1

我在瀏覽我的視圖時遇到了一些問題。 這裏是我的配置: 我有1個Tabbar控制器有2個關係segues嵌入到導航控制器內的2個簡單視圖。 現在我想從視圖控制器1導航到視圖控制器3,我也想顯示在tabbar內選擇正確的選項卡。如果我來自視圖控制器1,我還希望後退按鈕將我重定向到前一個選項卡。我嘗試了在視圖之間連接的segue,但如果我這樣做,它只是將視圖控制器推到導航堆棧上,但不會更改選項卡。所以,我現在的問題是,什麼是管理這個問題如何從一個標籤切換到另一個標籤?

截圖的最佳方式:

enter image description here

回答

1

這裏有一個辦法做到這一點。但我發佈這真的說明你爲什麼不應該做到這一點。

  • 我使用VC2和VC3的視圖標籤屬性來傳遞導航數據,它具有緊密耦合所有三個對象的效果。
  • 我覆蓋VC1-> VC3上下文的back bar按鈕。你失去一致性。
  • VC3-> VC2提供後退動畫。 VC3-> VC1從一個選項卡翻轉到另一個選項卡時沒有動畫。更多不一致
  • VC1-> VC3,點擊Tab Item 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」切換我們選項卡,並設置最前面的視圖的視圖標籤屬性設置爲1 IF最前面的視圖是VC2,這會立即觸發VC3。如果最前面的視圖是VC3,則會正確設置後退按鈕。如果其他視圖控制器被添加到此堆棧,則此導航將會中斷。

ViewController2
有着 「移動到VC3」 按鈕,有線到故事板順着接下去VC3 「toVC3」

// 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 
相關問題