4

所以我在情节提要中有 3 个视图控制器(VC1、VC2 和 VC3)。

每个视图都有一个调用 IBAction 的按钮,它调用此方法以模态到另一个视图:

[self doSegue: myViewController_ID];

-(void) doSegue:(NSString *)_myViewController_ID
{
    //get UiViewController from storybord with Unique ID
    UIStoryboard *storyboard = self.storyboard;
    UITableViewController *svc = [storyboard instantiateViewControllerWithIdentifier:_myViewController_ID];

    //set presentation & transition styles
    svc.modalPresentationStyle = UIModalPresentationFullScreen;
    svc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

    //do segue
    [self presentViewController:svc animated:YES completion:nil];
}

让我们设置我从 VC1 到 VC2,一次在 VC2

我想要的是删除以前的 ViewController (VC1)。如果我现在从 VC2 转到 VC3,我想从视图层次结构或堆栈 VC2 中删除,依此类推。

这是因为我不会提供[self dismissViewControllerAnimated:YES completion:nil];方法

我不希望由于堆栈中所有视图控制器的积累而导致内存增长。

注意:我不会使用导航控制器或选项卡控制器,只使用视图控制器。

谢谢你的帮助。

4

1 回答 1

4

只是猜测,我没试过...

在 VC2 上保留 VC1 的引用 -> 使用 prepareForSegue 发送:

然后在VC2上

[self.previousViewController willMoveToParentViewController:nil];
[self.previousViewController removeFromParentViewController];

只是为了确保插入您的视图控制器

- (void)dealloc
{
   NSLog(@"dealloc: %@", self);
}

看看控制台


编辑:当您收到内存警告时,您可以在 segue 之后删除每个视图控制器,而不是删除每个视图控制器。您也可以尝试在 segue 之后使用 dismissViewControllerAnimated:completion:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

    // ???
    if ([self isViewLoaded] && self.view.window == nil) {
        NSLog(@"UNLOADING");
        self.view = nil;
        [self dismissViewControllerAnimated:NO completion:nil];
    }
}
于 2013-02-07T14:37:10.697 回答