1

我想知道下面这段代码究竟是如何工作的(是的,它确实按预期工作,并且它给出了不同的标签值,具体取决于单击了哪个按钮。)关键是:我们不是重复使用button7 次,在哪里剩下的6个按钮?执行此代码后,我们真的保留了 7UIButton秒的内存吗?

或者作为一个更普遍的问题:这是一种好的编程风格吗?关键是我需要根据单击的按钮执行不同的操作,而这种方法(以我有限的 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);
}
4

3 回答 3

1

不,您没有重用UIButton七次:循环的每次迭代都会UIButton在对类方法的调用中创建一个新实例buttonWithType:,并将其分配给同名的变量:

[UIButton buttonWithType:UIButtonTypeCustom];

如果您在循环中声明该变量,您的代码会更好:

for(int k=0;k<7;k++)
    {
         UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
         // ...the rest of the loop
    }

当您的按钮执行非常相似的操作时,这是一种非常好的编程风格。例如,计算器按钮的不同之处仅在于它们插入的数字。当按钮执行差异很大的操作时(例如插入与删除),您最好单独创建它们,而不是在循环中,并使用单独的方法为它们的点击服务。

于 2012-06-06T20:14:25.890 回答
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");
}
于 2012-06-06T20:15:48.987 回答
0

这段代码就足够了,您正在创建 7 个不同的按钮并将它们添加为子视图。一旦你-addSubview:,对象被添加到一个数组,通过.subviews属性访问UIView

尽管您应该在 for 循环中添加 UIButton *button。所以你的代码应该如下所示..

for(int k=0;k<7;k++)
    {
         UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
   ....
}

如果您需要out使用按钮执行 for 循环的某些操作,那么在循环之外声明它是有意义的,但这不是您的情况。希望这可以帮助。

于 2012-06-06T20:17:42.957 回答