![](/img/trans.png)
[英]popToViewController, it isn't give me any crash but, doesn't open controllview and animating so code doesn't work
[英]popToViewController not animating
伙計,我必須說,如果不是這個站點,我將沒有頭發,我現在可能會跳下橋。 好! 我的問題:
我在xcode 4.4中使用情節提要。 我有3個視圖控制器(確實有5個,但是我認為其他的都不相關)。 視圖控制器A推向視圖控制器B。視圖控制器B在其導航欄上有一個分段控件,其中包含2個分段和一個后退按鈕。視圖控制器B加載了選定的分段1。 當用戶選擇段0時,實例化視圖控制器C。 一切順利,一切順利。 您從A推到B,然后可以在按下時將其彈出到A。我的問題是當我popToViewController到包含視圖控制器A的數組列表時,它彈出了,但沒有動畫! 我知道您在想什么,“動畫:是假人!” 但是,動畫是嗎..嗯? 這是我的代碼:
這是視圖控制器B中的最新消息
-(IBAction)Previous:(id)sender{
[self.navigationController popViewControllerAnimated:YES];
}
- (IBAction)segmentSwitch:(id)sender;
{
if ([sender selectedSegmentIndex] == 0)
{
MapViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Map"];
[self.navigationController pushViewController:controller animated:NO];
}
else if ([sender selectedSegmentIndex] == 1) {
ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];
[self.navigationController pushViewController:controller animated:NO];
}
}
繼承人視圖控制器C
-(IBAction)Previous:(id)sender
{
NSInteger index = -1;
ReportAppDelegate *appDelegate =
(ReportAppDelegate *)[[UIApplication sharedApplication]delegate];
MainOrangeTestViewController *orangeViewController = [appDelegate orangeViewController];
orangeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Orange"];
NSArray* newVCarray = [[NSArray alloc] initWithObjects:orangeViewController, nil];
self.navigationController.viewControllers = newVCarray;
for(int i=0 ; i<[newVCarray count] ; i++)
{
if([[newVCarray objectAtIndex:i] isKindOfClass:NSClassFromString(@"MainOrangeTestViewController")])
{
index = i;
}
}
[self.navigationController popToViewController:[newVCarray objectAtIndex:index] animated:YES];
}
- (IBAction)segmentSwitch2:(id)sender; {
if ([sender selectedSegmentIndex] == 0)
{
MapViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Map"];
[self.navigationController pushViewController:controller animated:NO];
}
else if ([sender selectedSegmentIndex] == 1)
{
ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];
[self.navigationController pushViewController:controller animated:NO];
}
}
我知道當實例化時,您正在創建該視圖控制器的新實例以及創建新的導航堆棧(或類似的東西)。 我認為這可能與它有關。 無論如何,為什么地球上沒有動畫流行音樂? 我希望在當前的構建中實現一些東西,但是如果需要重新構建,那就這樣吧! 任何幫助是極大的贊賞。 我肯定已經完成了這一作業,但是沒有解決方案。
預先感謝所有人!
編輯:我應該補充一點,從視圖控制器B回到A的初始POP是動畫的。 但是,當您開始切換分段控件時以及切換到查看控件C時,回到視圖控制器A並不會使彈出窗口具有動畫效果。 因此,最初從A加載到B時,它會以成功的動畫彈出。 但是切換后,它不顯示動畫又彈出回到A,並且動畫方法為YES。
您是否只是想按A-> B-> C,然后再次跳回A,跳過B? 如果是這樣,則無需修改導航控制器的viewControllers屬性。
// in vcC.m ...
-(IBAction)Previous:(id)sender
{
[self.navigationController popToRootViewControllerAnimated:YES];
}
在課程參考中查看pop的不同品種。 您可以彈出一個,或彈出到根目錄,或彈出到歷史記錄中的特定VC。 這樣做的方法是讀取 viewControllers堆棧(而不是將其寫入),找到要彈出到的VC,然后使用代碼中的popTo ...方法。
但這聽起來像popToRoot是您所需要的。
您的情況仍然有些困惑,但這是另一個提示:您可以預先創建歷史記錄。 假設您要從VC0推送到VC2,並且在彈出時要從VC2彈出到VC1或VC0。 完全可行:
// in VC0.m, animated push to VC2
// push to vc1 invisibly
[self.navigationController pushViewController:vc1 animated:NO];
// we've made history! now push visibly to vc2
[self.navigationController pushViewController:vc2 animated:YES];
要選擇彈出位置...
// in VC2.m
if (/* user needs a regular pop back to VC1 */) {
[self.navigationController popViewControllerAnimated:YES];
} else // pop back two, to VC0
NSArray *viewControllers = [self.navigationController viewControllers];
// we're not assuming that vc0 is the root here, the top of the navigation stack
// is at index=count-1. self is at the top. a regular pop is just below == count-2.
// two pops is at count-3, and so on.
NSInteger backBackIndex = viewControllers.count - 3;
// in case we get here by some other pushing path, worst case pop is to the root
backBackIndex = MAX(backBackIndex, 0);
UIViewController *backBackVC = [viewControllers objectAtIndex:backBackIndex];
[self.navigationController popToViewController:backBackVC animated:YES];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.