以编程方式创建元素并重用代码
我需要以编程方式创建几个按钮和标签。 大多数情况下,除文本,标签和框架外,它们都具有相同的属性(不透明,backgroundColor,textColor)。
在试图限制我输入的代码量时,我认为这是可行的:
// generate generic properties for our buttons UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; tempButton.opaque = true; tempButton.backgroundColor = [UIColor whiteColor]; tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];; [tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal]; [tempButton addTarget:self action:@selector(handleButtonTap:) forControlEvents:UIControlEventTouchUpInside]; // generate specific button1 properties, assign to ivar, and display tempButton.frame = CGRectMake(81, 136, 159, 37); tempButton.tag = BUTTON_1_TAG; [tempButton setTitle:@"button 1 title" forState:UIControlStateNormal]; self.button1 = tempButton; [self.view addSubview:self.button1]; // generate specific button2 properties, assign to ivar, and display tempButton.frame = CGRectMake(81, 254, 159, 37); tempButton.tag = BUTTON_2_TAG; [tempButton setTitle:@"button 2 title" forState:UIControlStateNormal]; self.button2 = tempButton; [self.view addSubview:self.button2];
正如大多数人已经知道的那样,只有最后一个按钮正在显示。 我认为这是因为我真的在做的是覆盖tempButton。
有没有一种解决方案可以让我完成我在这里要做的工作,而无需为每个元素创建单独的“temp”变量?
此外,它似乎会有我的代码上面的内存泄漏问题。 我的理解是,tempButton最初是自动释放的,但每次我用它来设置我的伊娃时,是不是又被保留了下来? 这样做后,我需要发送tempVar一个版本,所以它会回落到1,所以当autorelease被触发时,它实际上会被释放?
谢谢你的帮助!
1.)你正在为一个临时变量分配一个新的UIButton。 这只是一项任务。 作业不保留,所以你没有内存泄漏。
2.)您可以创建一个返回部分配置按钮的方法,然后设置不同的部分:
- (UIButton *)myButton {
UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
tempButton.opaque = true;
tempButton.backgroundColor = [UIColor whiteColor];
tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];;
[tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal];
return tempButton;
}
....
IButton *tempButton = [self myButton];
[tempButton setTitle:@"button 1 title" forState:UIControlStateNormal];
tempButton.frame = CGRectMake(81, 136, 159, 37);
[self.view addSubview:tempButton];
tempButton = [self myButton];
tempButton.frame = CGRectMake(81, 254, 159, 37);
[tempButton setTitle:@"button 2 title" forState:UIControlStateNormal];
[self.view addSubview:tempButton];
既然你已经给你的按钮设置了独特的标签,你不需要像self.button1,self.button2那样分配给iVArs,你可以使用[self.view viewForTag:]来检索正确的子视图。
但是,正如其他人所说,如果您确实使用'self.button1 =',该按钮将被保留,并且您需要在dealloc中释放,并且担心会调用 - [view didUnload] - 如果不在那里释放,那么你将有指向不再在视图中的按钮的指针。
你可以创建一个构建你的“tempButton”的方法。
- (UIButton *)createTempButton {
UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
tempButton.opaque = true;
tempButton.backgroundColor = [UIColor whiteColor];
tempButton.titleLabel.font = [UIFont fontWithName:@"Helvitica-Bold" size:15];;
[tempButton setTitleColor:[UIColor magentaColor] forState:UIControlStateNormal];
[tempButton addTarget:self action:@selector(handleButtonTap:) forControlEvents:UIControlEventTouchUpInside];
return tempButton;
}
那么当你需要一个新的“tempButton”时,你可以调用它。
UIButton *aTempButton = [self createTempButton];
您必须创建单独的按钮对象。 由于UIButton不符合NSCopying协议,因此没有更简单的方法。 如果你做的很多,写一个方法来创建一个按钮,设置公共属性并返回对象。 另一种方法是制作一个Nib文件并制作实例。
self.button = ...
保留你的按钮吗? 是的,如果该物业的二传手保留它。 当视图ID被卸载或释放时,您将不得不释放它。
上一篇: Create elements programmatically and reuse code
下一篇: xcode