objective-c - 在没有重复代码的情况下,对 Storyboard中的一堆控件执行相同的操作

标签 objective-c ios xcode interface-builder

我在 Storyboard上有 3 种控件类型(bigButton0....bigButton11、btnSmall0...btnSmall11 和 lbl0...lbl11)。

我想将相同的图像分配给所有 btnBig0 到 btnBig11。 我目前正在使用冗长的冗余代码来执行此操作,因为我没有找到任何更智能的解决方案,但我需要在运行时执行此操作。

有人可以告诉我如何缩短我的代码吗? 非常感谢。

NSString * sImageName = [NSString stringWithFormat:@"button_bg_%.0f_%.0f_normal.png", L_CELL_W, L_CELL_H];

[bigButton0 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton1 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton2 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton3 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton4 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton5 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton6 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton7 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton8 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton9 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton10 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];
[bigButton11 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateNormal];

sImageName = [NSString stringWithFormat:@"button_bg_%.0f_%.0f_down.png", L_CELL_W, L_CELL_H];

[bigButton0 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton1 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton2 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton3 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton4 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton5 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton6 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton7 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton8 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton9 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton10 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];
[bigButton11 setImage:[UIImage imageNamed:sImageName] forState:UIControlStateHighlighted];

最佳答案

有很多方法可以缩短这段代码。一种是使用 IBOutletCollection。给你的 View Controller 一个实例变量,它是一个集合类型,如 NSArray,并将其注释为 UIButtonIBOutletCollection:

@implementation MyViewController {
    IBOutletCollection(UIButton) NSArray *bigButtons;
}
...

如果您愿意,可以在您的公共(public)接口(interface)或 .m 文件的类扩展中将其设为属性:

#import "MyViewController.h"

// Class extension at the top of MyViewController.m
@interface MyViewController ()
@property (nonatomic, strong) IBOutletCollection(UIButton) NSArray *bigButtons;
@end

// Normal class @implementation comes after the class extension
@implementation MyViewController
...

现在,在 Interface Builder 中,您可以将这个 socket 集合连接到所有大按钮。然后您可以在代码中迭代集合:

NSString * sImageName = [NSString stringWithFormat:@"button_bg_%.0f_%.0f_normal.png", L_CELL_W, L_CELL_H];
UIImage *normalImage = [UIImage imageNamed:sImageName];
sImageName = [NSString stringWithFormat:@"button_bg_%.0f_%.0f_down.png", L_CELL_W, L_CELL_H];
UIImage *highlightedImage = [UIImage imageNamed:sImageName];

for (UIButton *button in bigButtons) {
    [button setImage:normalImage forState:UIControlStateNormal];
    [button setImage:highlightedImage forState:UIControlStateHighlighted];
}

为每种类型的按钮重复(使用单独的集合 ivar)。

关于objective-c - 在没有重复代码的情况下,对 Storyboard中的一堆控件执行相同的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539250/

相关文章:

ios - Swift 中的单行 if 语句

ios - UISearchBar 向下移动 20 像素

iOS:使用哪种增强现实 SDK 用于虚拟试衣间?

ios - 无法在模拟器 "The operation couldn’ 上运行应用程序无法完成。 (LaunchServicesError 错误 0。)”

ios - Xcode Playground : "error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"

objective-c - 如何禁止 NSDate 进行自动时区转换

ios - 如何围绕列绘制轮廓?

ios - 在 Swift Pod 中混合 Objective-C 文件

ios - 如何进行LinkingObject的迁移?

ios - 如何以编程方式更改 uiimageview 图像