微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – removeFromParentViewController – 你以后需要零吗?

一个孩子的视图控制器可以自动关闭吗? …..

你有一个视图控制器“RedMessage”.你有一个普通的强大财产…

@property(强)RedMessage *红色;

添加它(“模态”)在您当前的VC …

self.red = (RedMessage *)[self.storyboard
     instantiateViewControllerWithIdentifier:@"RedMessageID"];
self.red.view.frame = self.view.frame;
[self.view addSubview:self.red.view];
[self addChildViewController:self.red];
[self.red didMovetoParentViewController:self];

为了摆脱它以后,这样做

[self.red willMovetoParentViewController:nil];
[self.red.view removeFromSuperview];
[self.red removeFromParentViewController];

但实际上,你需要这样做吗?

[rm willMovetoParentViewController:nil];
[rm.view removeFromSuperview];
[rm removeFromParentViewController];
rm = nil;

你需要“= nil”吗?

请注意,这个问题是至关重要的,因为:如果您没有将其删除,则可以在新的视图控制器中执行以下操作:

-(void)dismissMyselfCompletely
    {
    [self willMovetoParentViewController:nil];
    [self.view removeFromSuperview];
    [self removeFromParentViewController];
    }

这是非常方便的.

简而言之,如果你在新的顶视图控制器里面这样做 – 它会“工作”,它是否释放VC?

当removeFromParentViewController发生时,父VC了解它可以释放self.red吗?

解决方法

经过相当大的测试,我们发现似乎是这样的情况:

您实际上可以让VC“自己删除”.

它会消失,不会保留.

我们将VC顶部添加到这个顶部(只是在通常的方式你添加一个“模态”VC顶部…)

-(void)showOverlay:(NSDictionary*)dict
    {
    Red *rr = (Red *)[self.storyboard
        instantiateViewControllerWithIdentifier:@"RedID"];
    rr.view.frame = self.view.bounds;
    [self.view addSubview:rr.view];
    [self addChildViewController:rr];
    [rr didMovetoParentViewController:self];

    [rr useThisData:dict];
    }

注意,没有属性持有rr – 它刚刚创建并在该类别中即时添加.

里面的“红”我们摆脱它就像这样…

-(void)dismiss:(UITapGestureRecognizer *)sender
    {
    [self.view exitLeftSmoothly:0 then:^
        {
        [self willMovetoParentViewController:nil];
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
        }];
    }

(exitLeft只是一个动画,不相关)

最后你可以这样测试:

-(void)viewDidAppear:(BOOL)animated
    {
    [super viewDidAppear:animated];
    ....
    [self _teste];
    }

-(void)_teste
    {
    Red __weak *mySelf = self;
    dispatch_after_secs_on_main(0.5,^
        {
        NSLog(@"tick !!!!!!!!!!!!");
        if ( mySelf == nil ) NSLog(@"I no longer exist - WTF!");
        [mySelf _teste];
        });
    }

你可以清楚地看到,一旦“红色”vc被解雇,确实,股票代码停止运行:“红色”已经消失.

它似乎工作可靠.你的输出会看起来像这样…

2014-10-22 17:26:36.498 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:37.031 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:37.576 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:38.124 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:38.674 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.217 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.764 [1738:111092] tick --- !!!!!!!!!!!!
2014-10-22 17:26:39.764 [1738:111092] I no longer exist --- WTF!

要重申,如AnujYadav指出,如果您在父VC中使用属性为“红色”…

@property (strong) Red *red;

然后

self.red = (Red *)[self.storyboard
 instantiateViewControllerWithIdentifier:@"RedID"];

确实这不行.在这种情况下,您必须在父母中self.red = nil,否则不会消失.

原文地址:https://www.jb51.cc/iOS/328950.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐