2012-12-20 56 views
2

我有一個很大的應用程序,其中有很多使用故事板的轉換。 過渡應該是從右到左,所以我做了一個自定義的繼續來執行它。奇怪的自定義segue行爲 - 導航堆棧損壞

當我使用常規轉換時,我保存的每個視圖控制器都會保留,直到彈出它爲止。

雖然使用自定義segues並不保留先前的控制器(推送當前控制器的人),但當我彈出時,控制器的實例會獲取不同的內存地址,這表示指針已更改。

這是自定義推送SEGUE:

UIViewController *sourceViewController = (UIViewController*)[self   sourceViewController]; 
UIViewController *destinationController = (UIViewController*)[self destinationViewController]; 

CATransition* transition = [CATransition animation]; 
transition.duration = .3f; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
transition.type = kCATransitionPush; 
transition.subtype = kCATransitionFromLeft; 

[sourceViewController.navigationController.view.layer addAnimation:transition 
                  forKey:kCATransition]; 

[sourceViewController.navigationController pushViewController:destinationController animated:NO]; 

和自定義彈出SEGUE:

[self performSegueWithIdentifier:@"SearchToMenu" sender:self]; 

似乎沒有什麼:

UIViewController *sourceViewController = (UIViewController*)[self sourceViewController]; 
UIViewController *destinationController = (UIViewController*)[self destinationViewController]; 

CATransition* transition = [CATransition animation]; 
transition.duration = .3f; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
transition.type = kCATransitionPush; 
transition.subtype = kCATransitionFromRight; 

[sourceViewController.navigationController.view.layer addAnimation:transition 
                  forKey:kCATransition]; 

[sourceViewController.navigationController pushViewController:destinationController animated:NO]; 

我用這種方法進行的SEGUE工作,我還沒有找到任何網上。

如果我需要提供更多的代碼示例,屏幕截圖等,請讓我知道。

回答

0

您的popViewController正在推送,而不是彈出。

這條線:

[sourceViewController.navigationController pushViewController:destinationController animated:NO]; 

應該是:

[sourceViewController.navigationController popViewControllerAnimated:NO]; 

您的自定義賽格瑞並保留以前的控制器。但是segue的destinationController總是一個新鮮實例化的對象。你注意到你爲新控制器獲得了不同的內存地址,但是如果你檢查你的堆棧,你會看到原始的viewController仍然存在,三個對象停靠在堆棧上。在這個修正後的版本中,你會返回到viewContoller的那個實例,就像你打算的那樣。

這就是爲什麼你永遠不應該使用標準的push segue來導航回到堆棧上的任何位置。儘管故事板會暗示這將會發生,但這是虛幻的:您只是導航到前一個viewController類的新實例。它看起來與之前的狀態完全相同,因爲它使用的是同一個Storyboard佈局。

這是一個很好的例子,可能最好不要使用segue。這不僅讓人困惑,而且當你回彈時,如果你想在prepareForSegue中配置「destinationViewController」,它將不會影響你彈出的viewController。您也許已經注意到故事板變得混亂了,因爲它丟失了哪個ViewController包含在哪個NavController中。你失去了導航欄和配置它們的能力(在故事板中 - 它們仍然在應用程序中)。

+0

感謝您的回答 這就是問題..太愚蠢了,我沒有看到它。 無論如何,我沒有看到故事板中的任何腐敗。它似乎工作得很好。 你會建議我使用普通的.xib文件嗎? – alon7

+0

如果它正在爲您工作,繼續使用故事板 - 它有助於您瞭解導航邏輯的概述。 – foundry