这段代码如何创建按钮?

时间:2012-06-06 20:07:31

标签: iphone objective-c

我想知道以下代码是如何工作的(是的,它确实按预期工作,并且根据单击的按钮提供不同的标记值。) 重点是:我们不是重复使用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);
}

3 个答案:

答案 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]; .... } ,那么在循环外声明它是有道理的,但这不是您的情况。希望这会有所帮助。