我想知道以下代码是如何工作的(是的,它确实按预期工作,并且根据单击的按钮提供不同的标记值。)
重点是:我们不是重复使用button
7次,剩下的其他6个按钮在哪里?执行此代码后,我们确实为7 UIButton
s保留了内存吗?
或者作为一个更普遍的问题:这是一种好的编程风格吗?关键是我需要根据点击的按钮采取不同的动作,这种方法(我有限的objc技能)看起来最直接。 提前致谢, 一个刚开始的iOS开发人员。
UIButton *button;
for(int k=0;k<7;k++)
{
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self
action:@selector(aMethod:)
forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"" forState:UIControlStateNormal];
button.frame = CGRectMake(80, 20+30*k, 30, 30);
button.backgroundColor=[UIColor clearColor];
button.tag=k;
[subview addSubview:button];
}
函数aMethod:定义为:
-(IBAction)aMethod:(id)sender
{
UIButton *clickedButton=(UIButton *) sender;
NSLog(@"Tag is: %d",clickedButton.tag);
}
答案 0 :(得分:1)
不,你没有重复使用UIButton
七次:循环的每次迭代在对类方法UIButton
的调用中创建buttonWithType:
的新实例,并将其分配给同名变量:
[UIButton buttonWithType:UIButtonTypeCustom];
如果在循环中声明了该变量,那么代码会更好:
for(int k=0;k<7;k++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
// ...the rest of the loop
}
对于按钮执行非常类似操作的情况,这是一种非常好的编程风格。例如,计算器按钮的不同之处仅在于它们插入的数量。当按钮执行的操作差别很大(例如插入与删除)时,最好分别创建它们,而不是循环创建,并使用单独的方法为其点击提供服务。
答案 1 :(得分:0)
在此代码中,您只需创建7个具有不同位置和标签的按钮。它要好得多,然后重复创建代码7次。我可以为您提供的一件事 - 为按钮标签创建一些枚举以防止这样的代码:
switch([button tag])
{
case 1:
// do something
break;
case 2:
// do something else
break;
case 3:
// exit
break;
.....
default:
assert(NO && @"unhandled button tag");
}
具有枚举值的代码更容易阅读
switch([button tag])
{
case kButtonForDoSomething:
// do something
break;
case kButtonForDoSomethingElse:
// do something else
break;
case kButtonExit:
// exit
break;
.....
default:
assert(NO && @"unhandled button tag");
}
答案 2 :(得分:0)
这段代码足够了,你创建了7个不同的按钮并将它们添加为子视图。 -addSubview:
后,对象将添加到数组中,通过.subviews
的{{1}}属性访问。
虽然您应该在for循环中添加UIButton *按钮。所以你的代码应该如下所示..
UIView
如果您需要使用按钮执行for循环的for(int k=0;k<7;k++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
....
}
,那么在循环外声明它是有道理的,但这不是您的情况。希望这会有所帮助。