在视图出现时创建UILabel,并在视图消失时将其销毁

时间:2015-05-01 18:55:16

标签: ios objective-c

对于我的应用程序的教程,我正在尝试创建一个UILabel,当视图出现时会在显示的屏幕上漂移,然后被销毁,这样如果用户在教程中回到该视图,将会创建UILabel重新跨越页面。这是我用UIPageViewController显示的一个自定义视图控制器的示例:

//this is just a custom UILabel with some padding
@property (nonatomic) PaddedLabel *directionsLabel;

//I have tried setting UILabel to nil or removing it from view
-(void)viewWillDisappear:(BOOL)animated
{

    NSLog(@"view is disappearing");
    //this does not remove the label
    self.directionsLabel = nil;
    //nor does this
    [self.directionsLabel removeFromSuperview];

}

- (void)viewDidAppear:(BOOL)animated
{
    [self messageTutorial];
}

- (void)messageTutorial
{

    CGFloat width = [[UIScreen mainScreen] bounds].size.width;
    CGFloat height = [[UIScreen mainScreen] bounds].size.height;
    PaddedLabel *directionsLabel = [[PaddedLabel alloc] initWithFrame:CGRectMake(_width/2, _height/2, 100, 100)];
    directionsLabel.text = @"test";

    CGRect f = directionsLabel.frame;
    f.size = size;
    directionsLabel.frame = f;
    directionsLabel.center = self.view.center;
    f = directionsLabel.frame;
    f = directionsLabel.frame;
    f.origin.y = .1*height;
    directionsLabel.frame = f;
    [self.view addSubview:directionsLabel];


   [UIView animateWithDuration:TUTORIAL_DISAPPEAR_TIME animations:^{
        directionsLabel.alpha = .5;
       CGRect f = directionsLabel.frame;
       f.origin.y = height - f.size.height*1.4;
       directionsLabel.frame = f;
       NSLog(@"animating");

    } completion:^(BOOL finished) {
        [directionsLabel removeFromSuperview];
        //this also doesn't actually remove the label

    }];


}

问题在于,如果用户回头看到这个视图,她现在会看到一个新标签和旧标签,所以如果你来回来回翻页你会得到许多标签都说同样的东西,在整个屏幕上进行的不同阶段。

当视图消失时如何删除UILabel并在视图出现/重新出现时添加/创建新视图?

谢谢。

3 个答案:

答案 0 :(得分:2)

viewWillDisappear方法中的代码是向后的。你需要:

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"view is disappearing");
    [self.directionsLabel removeFromSuperview];
    self.directionsLabel = nil;
}

如上所述,在尝试删除之前将self.directionsLabel设置为nil会导致无操作。

此外,请务必在创建标签时设置self.directionsLabel

答案 1 :(得分:0)

self.directionsLabel方法中创建directionsLabel时,您似乎没有将messageTutorial设置为任何内容。它是那里标签的本地实例。你应该在某个地方的方法中设置它。

之后,将其从viewWillDisappear中的超级视图中删除即可使用(经过测试验证)。

答案 2 :(得分:0)

而不是将标签设置为nil并有效地销毁标签对象(假设自动引用计数已开启),而是使用以下方法隐藏并在需要时显示标签。

[self.directionsLabel setHidden:YES]; // hides it
[self.directionsLabel setHidden:NO]; // shows it

您已经有了正确的想法,设置您不会使用nil的对象并将其从超级视图中删除,但它已经超过了。 UILabel对象使用的内存量可以忽略不计,您最好先创建一次对象,然后根据需要更改它的属性。