 <p>If you implement one of these two <strong>CASES</strong> provided below you will definitely get <code>viewWillAppear</code> and be sure you wrote it correct with it's <code>super</code></p> <pre><code>-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Your code goes here } </code></pre> <p><strong>CASE 1 - Using Navigation Controller</strong> <br><br>If you want to Pop from one ViewController to another you need to have all of them in the same navigation stack. It means every time you want to <strong>open new View Controller</strong> you need to do something like this:</p> <pre><code> [self.navigationController pushViewController:nextVC animated:YES]; </code></pre> <p><strong>instead of doing this</strong></p> <pre><code>[self presentViewController:nextVC animated:YES completion:nil]; </code></pre> <p>And after that if you already have all VCs in that same Navigation Controller, you can use this code to <strong>go one step back</strong> (e.g. from B to A, from C to B)</p> <pre><code>[self.navigationController popViewControllerAnimated:YES]; </code></pre> <p>And you can use this code to <strong>jump to the beginning</strong> (e.g. from C to A)</p> <pre><code>[self.navigationController popToRootViewControllerAnimated:YES]; </code></pre> <p><br> <strong>CASE 2 - Usual Cycle (Looks like what you need)</strong> <br>This is en easy case but you need to be more careful with your code. You can just get parent of the parent to Leave current View Controller</p> <p>[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:NO completion:nil];</p> <p><br><br> <em>Note: You can't use navigation controller functions with modal presentation functions. Push is with Pop, Present is with Dismiss</em> </p> <hr> <p><strong>UPDATE 1</strong> <br><br>Modal segues is creating a nested connection(one line of a tree). If you close child(current) VC parent VC appears normally. If you want to jump to the parent of the parent just dismiss the parent and it will dismiss all it's child VCs. I don't know why popViewControllerAnimated works fine from B to A but you are not allowed to do like that. Just use dismiss if if you are using modal segues. Never use Pop. Pop is for Push. Do this and everything should work fine.</p> <p>For going back from B to A change your code to:</p> <pre><code>[self dismissViewControllerAnimated:YES completion:nil]; </code></pre> <p>For going back from C to A use this code:</p> <pre><code>[[self parentViewController] dismissViewControllerAnimated:YES completion:nil]; </code></pre> <p><strong>OR</strong></p> <pre><code>[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; </code></pre> <hr> <p><strong>UPDATE 2</strong> <br><br>I discovered that for STORYBOARD segues we NEED to use this code to go back</p> <pre><code>[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:NO completion:nil]; </code></pre> <p>This code totally fine jumps from <strong>C to A</strong> and <code>viewWillAppear</code> is being called BUT <code>viewWillAppear</code> is being called both in <strong>A and B</strong></p> <p>You have 3 tracks to choose (Actually you have more, like using delegates and notifications but this is too bad)</p> <ol> <li>Stick to this version but it is not reliable. </li> <li>Keep using storyboard but for using backCtoA button connect with A from VC C so it always loops but loads again every time. Bad but still ok.</li> <li>Finally the right solution is to move to Navigation Controllers(btw. you can hide Nav Bar if you want) and have VCs Stack so you can easily use popToViewController</li> </ol>