2015-10-21 55 views
1

後,我有一個小問題。 我的工作與視圖控制器這樣一個簡單的應用程序中的導航控制器: A-> B-> C( - >是模態塞格斯) 查看A是根視圖控制器,我需要從前來回A C.如果我從B調用popToViewController方法,A運行viewWillAppear;如果我所說的popToViewController從C(至A),viewWillAppear中上的一個不叫。 我該如何解決這個問題?viewWillAppear中不叫popToViewController

的ViewController甲

#import "ViewControllerA.h" 
#import "ViewControllerB.h" 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self setupSceneA]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"goToB"]) { 
     ViewControllerB *b = [segue destinationViewController]; 
    } 
} 

的ViewController B(上Xcode7和iOS 9工作)

#import "ViewControllerB.h" 
#import "ViewControllerC.h" 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self setupSceneB]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"goToC"]) { 
     ViewControllerC *c = [segue destinationViewController]; 
    } 
} 

- (IBAction)backToAButton:(id)sender { 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

的ViewControllerÇ

#import "ViewControllerC.h"; 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [self setupSceneC]; 
} 


- (IBAction)backToBButton:(id)sender { 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

- (IBAction)backToAButton:(id)sender { 
    [[self parentViewController] dismissViewControllerAnimated:NO completion:nil]; 
} 
+0

那麼你使用模態或推塞格斯?它們是有區別的。看起來你正在談論推塞格。 – Andy

+0

如果你使用模態賽格,你需要使用dismiss view controller。 –

+0

我正在使用模態segues,並在popToViewController後不久使用關閉視圖控制器。當我在B上時沒關係,但是當我在C上時,它調用A而不運行viewWillAppear。 –

回答

-2

這應該是你的設計(順便說一句,你可以隱藏導航欄,如果你想。):

控制器A→模態繼續導航控制器(控制器B是根視圖控制器) - >推繼續控制器C.

所以,如果你想從C到B,你做一個流行。

當你想從B到A或從C到A時,你做一個解僱。

0

如果實現提供下面你一定會得到viewWillAppear,並確保這兩個案例之一,你寫的正確與它的super

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // Your code goes here 
} 

CASE 1 - 使用導航控制器

如果你想從一個ViewController流到另一個ViewController,你需要將它們全部放在同一個導航棧中。這意味着你要打開新瀏覽器每次你需要做的是這樣的:

[self.navigationController pushViewController:nextVC animated:YES]; 

而不是做這個

[self presentViewController:nextVC animated:YES completion:nil]; 

在這之後,如果你已經擁有的所有VC在同一個導航控制器中,您可以使用此代碼向後退一步(例如從B到A,從C到B)

[self.navigationController popViewControllerAnimated:YES]; 

而且,您可以使用此代碼跳到開始(例如從C到A)

[self.navigationController popToRootViewControllerAnimated:YES]; 


CASE 2 - 通常的週期(貌似你的需要)
這是EN容易出現的情況,但你需要更加小心你的代碼。你可以得到父母的父母離開當前視圖控制器

[[[自我presentingViewController] presentingViewController] dismissViewControllerAnimated:NO完成:零]



注:不能使用導航控制器的功能與模式演示功能。推是流行,現狀是與辭退


UPDATE 1

模態塞格斯被創建嵌套連接(樹的一行)。如果關閉小孩(當前)VC父母VC正常出現。如果你想跳到父母的父母,只要解僱父母,它會解僱所有的孩子VC。我不知道爲什麼popViewControllerAnimated可以很好地從B到A,但你不能這樣做。如果你正在使用模態賽段,只需使用dismiss。切勿使用Pop。 Pop是Push。做到這一點,一切都應該正常工作。

爲您的代碼會從B改回了更改,以:

[self dismissViewControllerAnimated:YES completion:nil]; 

對於打算從C返回到一個使用此代碼:

[[self parentViewController] dismissViewControllerAnimated:YES completion:nil]; 

OR

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 

更新2

我發現,對於情節串連圖板塞格斯我們需要使用這個代碼從ç回去

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:NO completion:nil]; 

此代碼完全正常跳轉到一個viewWillAppear被調用,但viewWillAppear正在叫做A和B

你有3首曲目可供選擇(其實你有更多的,就像使用代表和通知,但這太糟糕了)

  1. 堅持這個版本,但它不可靠。
  2. 保持使用故事板,但使用backCtoA按鈕連接VC C中的A,因此它總是循環但每次都會再次加載。不好,但仍然可以。
  3. 最後的解決方案是遷移到導航控制器和有風投棧,所以你可以很容易地使用popToViewController
+0

但是B和C都是模態的。爲什麼如果我使用流行音樂從B到A是否奏效?如果我需要從C回到A並獲得A的觀點,我必須實施第二種情況?我必須在A或C中實現它? –

+0

@AngeloPettinelli你的週期是這樣的:A從A加載到B到B然後從C到C然後你想跳回到A,對吧? –

+0

是的。我需要從B和C去A。我使用popToRootViewController,但是從B它起作用,從C否 –