数组中缺少UIView

时间:2013-10-04 07:01:47

标签: iphone ios objective-c arrays uiview

我在数组中添加UIViews。在按钮上单击,我将它们添加到另一个视图。完美的工作。

问题是,当我在数组中添加一个以上的视图时。视图只设置一次。

这是我的代码。

-(IBAction)buttonClick:(id)sender {

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    view1.backgroundColor = [UIColor redColor];

    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    [view2 setBackgroundColor:[UIColor orangeColor]];

    UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    [view3 setBackgroundColor:[UIColor greenColor]];

    UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    [view4 setBackgroundColor:[UIColor blueColor]];

    NSArray *views = [NSArray arrayWithObjects:view2, view2, view1, view4, view3, nil];

    [self setViews:views];

}

-(void) setViews:(NSArray*)views {

    [testView1 addSubview: [views objectAtIndex:0]];
    [testView2 addSubview: [views objectAtIndex:1]];
    [testView3 addSubview: [views objectAtIndex:2]];
    [testView4 addSubview: [views objectAtIndex:3]];
    [testView5 addSubview: [views objectAtIndex:4]];
}

输出为enter image description here

对于NSArray *views = [NSArray arrayWithObjects:view1, view2, view4, view4, view3, nil];,输出为enter image description here

对于NSArray *views = [NSArray arrayWithObjects:view1, view2, view3, view4, view4, nil];,输出为enter image description here

我说得更清楚了。对于[NSArray arrayWithObjects:view1, view1, view1, view1, view1, nil];,testView1,2,3,4为空,view1添加到testView5

无论添加多少次视图,如何才能带来完美的输出?

我想听听您的解释..!

6 个答案:

答案 0 :(得分:4)

我认为问题是如果你将一个对象插入一个数组,因为它是同一个对象,它将绘制(当你调用addSubview方法时)它的最新引用。它不是副本,它是同一个对象。

所以,如果你这样做:

UIView *a,*b,*c,*d;

NSArray *array = @[a,a,b,c,d];

你给他们一个不同的地方视图,你会看到绘制最新引用的A视图。您的setViews方法会在第一个位置绘制'a',当您再次访问同一个视图时,它会将其从第一个位置删除,然后在第二个位置绘制。

因此,如果您想要解决它,请在再次绘制之前创建它们的副本。创建视图的新实例。

希望有所帮助!

答案 1 :(得分:3)

来自Apple docs

  

视图只能有一个超级视图。如果视图已经具有超视图并且该视图不是接收者,则此方法会在使接收器成为新的超级视图之前删除先前的超视图。

这意味着,多次调用addSubview以添加相同的子视图只会在superview上添加一次(因为接收器将是相同的)。

解决方案:您必须将要重复的视图的多个副本作为子视图重复。

希望有所帮助!

答案 2 :(得分:2)

您可以通过addSubView方法在子视图层次结构中仅添加一次视图。 而你正在这样做。所以重复视图只添加一次。

答案 3 :(得分:1)

只需为重复视图初始化具有相同帧的另一个对象。像:

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
view1.backgroundColor = [UIColor redColor];

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view2 setBackgroundColor:[UIColor orangeColor]];

UIView *view21 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view21 setBackgroundColor:[UIColor orangeColor]];

UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view3 setBackgroundColor:[UIColor greenColor]];

UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[view4 setBackgroundColor:[UIColor blueColor]];

NSArray *views = [NSArray arrayWithObjects:view2, view21, view1, view4, view3, nil];

[self setViews:views];

答案 4 :(得分:1)

找到解决方案..!重复。

UIView *subview;
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:[views objectAtIndex:0]];
subview = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
[testView1 addSubview: subview];

为每个视图执行此操作为我提供了解决方案..!

答案 5 :(得分:0)

您添加的视图多次出现在同一帧上,因为在将其添加为子视图时不会更改帧。因此,重复的视图共享相同的位置,因此彼此重叠。在将它们添加为子视图

之前,您需要以编程方式更改重复视图的帧