0

我的控制器中有两个 UIView 成员,progressLineView 和 buttonsView。在某些时候,我称这个方法为:

- (void) drawPlayProgressLine{

    progressLineView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height)];
    progressLineView.backgroundColor = [UIColor whiteColor];
    [buttonsView addSubview:progressLineView];

}

一切正常,我还有一个改变视图位置的方法:

- (void) moveProgressLine{

    CGRect frame = progressLineView.frame;
    frame.origin.x++;
    progressLineView.frame = frame;
}

在该moveProgressLine方法被调用了几次之后,我想drawPlayProgressLine再次调用,而不是将视图完全移动到起始位置,它会创建一个新视图。调用的越drawPlayProgressLine多,我在屏幕上获得的视图就越多,但我只需要一个。

我不明白当我只创建一个对象时会发生这种情况。如何移动视图而不是每次都创建一个新视图?还有一个问题:如何才能完全删除(直到drawPlayProgressLine调用该方法再次创建它)

4

3 回答 3

0

您应该在创建它之前检查它是否已创建,并在必要时移动它:

- (void) drawPlayProgressLine{

    if(progressLineView == nil)
    {
        progressLineView = [[UIView alloc] init];
        progressLineView.backgroundColor = [UIColor whiteColor];
        [buttonsView addSubview:progressLineView];
    }

    progressLineView.frame = CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height);


}
于 2012-08-20T19:58:44.667 回答
0

您可能不会使父视图无效。不会创建新对象,而是在移动它们后将它们的演示文稿留在屏幕上。

至于第二个问题:

[progressLineView removeFromSuperview]; 
[progressLineView release];  
progressLineView = nil;
于 2012-08-20T20:04:18.583 回答
0

我不明白当我只创建一个对象时会发生这种情况。

每次调用-drawPlayProgressLine方法时都会创建一个新视图。调用 10 次,您将获得 10 次观看。

如何移动视图而不是每次都创建一个新视图?

不要每次都通过-drawPlayProgressLine. 相反,您可以执行以下任一操作:

  • progressLineView在创建视图控制器的视图层次结构时创建一次。-viewDidLoad是处理这类事情的理想场所。

  • progressLineView仅在当前为 nil 时检查并创建它的值。

无论您选择哪个,假设是一个实例变量,您都可以在您的方法progressLineView中执行您正在执行的操作。-moveProgressLine也就是说,就像progressLineView它已经存在一样使用,因为它确实存在。顺便说一句,移动视图的一种简单方法是修改它的center属性:

CGPoint *c = progressLineView.center;
c.x += 25.0;
progressLineView.center = c;

还有一个问题:如何才能完全移除(直到调用drawPlayProgressLine方法重新创建)

一种方法是在不使用视图时简单地隐藏视图。另一种是将它从其超级视图中删除(如果您保留它,则将其释放),然后将您的设置progressLineView为 nil。因此,如果progressLineView是 ivar,请执行以下操作:

[progressLineView removeFromSuperview];
[progressLineView release];              // if you're not using ARC and have retained it
progressLineView = nil;
于 2012-08-20T20:20:10.993 回答