对不起,初学者的问题:
我创建了一个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的副本分配给我的观点?
答案 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)
视图只能在一个父视图中显示。因此,您需要为每个父视图创建单独的标签。您可以通过编写辅助函数来减少键入。