对于我的应用程序的教程,我正在尝试创建一个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并在视图出现/重新出现时添加/创建新视图?
谢谢。
答案 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对象使用的内存量可以忽略不计,您最好先创建一次对象,然后根据需要更改它的属性。