簡體   English   中英

如何在視圖控制器之間切換並擺脫上一個

[英]How to switch between view controllers and get rid of the previous one

在android中,在活動之間進行切換非常簡單

你打電話

Intent intent = new Intent(this,NextActivity.class); <- define the next activity
startActivity(intent); <- start the next activity
finish(); < -get rid of the current activity

現在在iOS我知道如何做到這一點:

UIViewController *nextviewcontroller = [[UIViewController alloc]initWithNibName:@"nextvc" bundle:nil];
[self presentViewcontroller:nextviewcontroller animated:YES completion:nil];

如何擺脫當前的視圖控制器? 這樣currentviewcontroller在呈現nextviewcontroller后就死了嗎?

[self dismissViewController:YES]; 似乎並沒有達到目的

即使我不調用[self dismissViewController:YES];也會調用生命周期方法viewWillDisappear和viewDidDisappear [self dismissViewController:YES];

我希望從memory和Viewcontroller堆棧中刪除“ currentviewcontroller ”,以便在“ nextviewcontroller”中單擊“ back”將轉到currentviewcontroller之前的某些thirdviewcontroller

在iOS中有所不同,因為沒有活動的概念,並且所有內容都更加專注於應用本身(在Android中,您可以混合來自不同應用的活動)。 因此,沒有“視圖控制器堆棧”的概念。 最相似的概念是導航控制器的“導航堆棧”,您實際上在其中將新視圖控制器推入並彈出到某種線性導航中。 導航欄將自動創建,並使用后退按鈕填充。

presentViewController會在當前控制器上以模態方式顯示您的視圖控制器,但是您不能通過它來展示控制器,因為它正在保存並包含(“定義上下文”)新控制器。

如果您將導航控制器用於導航層次結構(不知道是否可以),則可以覆蓋“后退”按鈕並使用類似

UIViewController * prev = self.navigationController.viewControllers[self.navigationController.viewControllers.count -2 ]
[self.navigationController popToViewController:prev animated:YES]

使用模態視圖控制器,您可以嘗試類似的操作(我還沒有嘗試過,但是可能會起作用)

[self.presentingViewController.navigationController popViewControllerAnimated:YES]

您應將這些代碼之一寫入關閉按鈕的目標操作中。

iOS不會像Android那樣維護控制器的全局堆棧。 每個應用程序在其根目錄都顯示一個控制器,並且該控制器負責顯示應用程序中的其他控制器。 控制器可以使用presentViewcontroller:animated:completion:模態顯示其他控制器,但演示控制器仍位於所演示的控制器之下。

如果您當前的控制器是根控制器,那么您只需執行以下操作,而不是使用presentViewcontroller:animated:completion: ::

self.view.window.rootViewController = nextViewController;

根控制器通常是UINavigationController ,它確實管理着控制器的堆棧。 如果是這種情況,並且您當前的控制器位於堆棧的頂部,則可以執行以下操作:

[self.navigationController popViewControllerAnimated:NO];
[self.navigationController pushViewController:nextViewController animated:YES];

如果您的設置不同,那么您會做一些不同的事情。 不知不覺很難說些什么。 但是您很可能會遇到UINavigationController情況。

在nextviewcontroller的viewDidAppear中,您可以添加:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];    
    NSArray *controllers = self.navigationController.viewControllers;
    NSMutableArray *newViewControllers = [NSMutableArray arrayWithArray:controllers];
    [newViewControllers removeObjectAtIndex:[controllers count]-2];
    self.navigationController.viewControllers = newViewControllers;
}

iOS中沒有可用的類似功能,但您可以通過以下操作實現它

NSArray *viewControllers=[self.navigationController viewControllers];

NSMutableArray *newControllers=[[NSMutableArray alloc] init];

for(int i=[viewControllers indexOfObject:self];i<viewControllers.count;i++){
        [newControllers addObject:[viewControllers objectAtIndex:i]];
}

[self.navigationController setViewControllers:[[NSArray alloc] initWithArray:newControllers]];

我已經嘗試了將所有視圖控制器存儲在一個數組中的方法,但是對我來說不起作用。 當您嘗試popViewController ,它將移至堆棧中最后一個視圖控制器。 您可以制作2個導航控制器並在它們之間切換,也可以在特定導航控制器的視圖控制器之間切換。 例如。 您可以使用以下代碼在2個導航控制器之間切換:

    FirstNavController *fisrtView=[storyboard instantiateViewControllerWithIdentifier:@"firstnavcontroller"];
        self.window.rootViewController = firstView;

    }else{
        SecondNavController *secondView=[storyboard instantiateViewControllerWithIdentifier:@"loginnavcontroller"];
        self.window.rootViewController = secondView;

    }

如果您的FirstNavController有2個ViewController,則可以使用pushViewController在它們之間切換

SecondViewController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"secondviewcontroller"];
    [[self navigationController] pushViewController:sc animated:YES];

和popViewController

[self.navigationController popViewControllerAnimated:YES];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM