我需要以编程方式创建几个按钮和标签。在大多数情况下,除了文本,标签和框架外,它们将具有相同的属性(不透明,backgroundColor,textColor)。

在尝试限制需要输入的代码量时,我认为这可以工作:

//为我们的按钮生成通用属性
UIButton * tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
tempButton.opaque = true;
tempButton.backgroundColor = [UIColor whiteColor];
tempButton.titleLabel.font = [UIFont fontWithName:@“ Helvitica-Bold” size:15] ;;
[tempButton setTitleColor:[UIColor洋红色] forState:UIControlStateNormal];
[tempButton addTarget:self动作:@selector(handleButtonTap :) forControlEvents:UIControlEventTouchUpInside];

//生成特定的button1属性,分配给ivar并显示
tempButton.frame = CGRectMake(81,136,159,37);
tempButton.tag = BUTTON_1_TAG;
[tempButton setTitle:@“状态为UIControlStateNormal的”按钮1标题“];
self.button1 = tempButton;
[self.view addSubview:self.button1];

//生成特定的button2属性,分配给ivar并显示
tempButton.frame = CGRectMake(81,254,159,37);
tempButton.tag = BUTTON_2_TAG;
[tempButton setTitle:@“按钮2标题” forState:UIControlStateNormal];
self.button2 = tempButton;
[self.view addSubview:self.button2];


众所周知,只有最后一个按钮正在显示。我认为这是因为我实际上所做的只是覆盖tempButton。

有没有一种解决方案可以让我完成在这里要做的事情,而不必为每个元素创建单独的“临时”变量?

另外,上面的代码似乎存在内存泄漏问题。我的理解是tempButton最初是自动发布的,但是每次我使用它来设置ivar时,它是否不会再次保留?之后,我是否需要向tempVar发送一个释放,使其回落到1,以便在触发自动释放时将其释放?

谢谢你的帮助!

最佳答案

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];


由于为按钮赋予了唯一的标记,因此无需分配给iVArs,例如self.button1,self.button2,您只需使用[self.view viewForTag:]即可检索正确的子视图。

但是,正如另一个人所说,如果您确实使用'self.button1 =',则按钮会保留,并且您需要在dealloc中释放,并担心调用-[view didUnload]-如果您不这样做,不释放在那里,那么您将拥有指向视图中不再存在的按钮的指针。

关于iphone - 以编程方式创建元素并重用代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5130872/

10-09 13:23