如何将相同的子视图添加到不同的视图?

时间:2011-05-23 19:37:26

标签: iphone objective-c cocoa-touch

对不起,初学者的问题:

我创建了一个UILabel的实例,并希望将此UILabel的副本添加到4个不同的视图中。我尝试了下面的代码,但它不会工作,因为我将UILabel分配给一个视图然后将其分配给下一个 - 这导致UILabel从第一个视图中删除。这继续,所以我最终将UILabel分配给最后一个视图:

    UILabel *titleTitle = [[[UILabel alloc] initWithFrame:CGRectMake(120, -48, 100, 28)] autorelease];
titleTitle.text = @"Index";
titleTitle.textColor = [UIColor blackColor];
titleTitle.backgroundColor = [UIColor clearColor];
titleTitle.font = [UIFont fontWithName:@"Ballpark" size:25.0f];
[indexView addSubview:titleTitle];
[indexView2 addSubview:titleTitle];
[indexView3 addSubview:titleTitle];
[indexView4 addSubview:titleTitle];

如何设法将UILabel的副本分配给我的观点?

4 个答案:

答案 0 :(得分:5)

你不能这样做。视图只能有一个父级。如果要定义一次标签并在多个地方使用类似定义的标签,则应复制它。

编辑:@Michael Petrov指出UIView及其子类不符合NSCopying协议。我很难忽视这一点。

如果他提供的答案对你来说太复杂了,你可以创建一个帮助函数,为你生成一个新的UILabel实例。

-(UILabel *) generateLabel:(CGRect) location {
    UILabel *label= [[[UILabel alloc] initWithFrame:location] autorelease];
    label.text = @"Index";
    label.textColor = [UIColor blackColor];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont fontWithName:@"Ballpark" size:25.0f];

    return label;
}

从您的代码:

UILabel *l1 = [self generateLabel:CGRectMake(...)];
[self addToSubView:l1];
[l1 release];

UILabel *l2 = [self generateLabel:CGRectMake(...)];
[self addToSubView:l2];
[l2 release];

..等等。

答案 1 :(得分:3)

这可能对你的需求有些过分,但是如果你必须复制一个复杂的对象,那么归档和取消归档它应该有效:

NSMutableData *myData = [NSMutableData data];
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:myData] autorelease];

[archiver encodeObject:titleTitle forKey:@"myTitle"];
[archiver finishEncoding];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:myData] autorelease];


UILabel *t2 = [unarchiver decodeObjectForLey:@"myTitle"];
// set location attributes
[view addSubView:t2];
[t2 release];

UILabel *t3 = [unarchiver decodeObjectForLey:@"myTitle"];
// set location attributes
[view addSubView:t3];
[t3 release];

[unarchiver finishDecoding]; // Should be called once you will not decode any other objects

答案 2 :(得分:1)

这是不可能的,一个视图只能有一个父母。

您需要将其从当前父级中删除,以将其添加到其他位置。

答案 3 :(得分:1)

视图只能在一个父视图中显示。因此,您需要为每个父视图创建单独的标签。您可以通过编写辅助函数来减少键入。