0

我经常面临的一个问题是如何将相同的更改应用于同一视图中的许多 UI 元素。

我正在寻找的是可以像这个 Python 伪代码一样工作的东西:

def stylize(element): 
    # apply all the UI changes to an element
elements = [button1, button2, button3]
map(stylize,elements)

什么是正确的 Objective-C 方法来做到这一点(假设我不想要/不能子类化这样的 UI 元素)?

4

3 回答 3

0

我不知道 Python,我也不完全理解你的问题。我不清楚。

可能您正在寻找IBOutletCollection.

IBOutletCollection

Identifier used to qualify a one-to-many instance-variable declaration so that Interface Builder can synchronize the display and connection of outlets with Xcode. You can insert this macro only in front of variables typed as NSArray or NSMutableArray.

This macro takes an optional ClassName parameter. If specified, Interface Builder requires all objects added to the array to be instances of that class. For example, to define a property that stores only UIView objects, you could use a declaration similar to the following:

@property (nonatomic, retain) IBOutletCollection(UIView) NSArray *views;

For additional examples of how to declare outlets, including how to create outlets with the @property syntax, see “Xcode Integration”.

Available in iOS 4.0 and later.

Declared in UINibDeclarations.h.

讨论

有关如何使用这些常量的更多信息,请参阅“与对象通信”。有关在 Interface Builder 中定义和使用操作和出口的信息,请参阅 Interface Builder 用户指南。

检查这些链接:

  1. UIKit 常量参考
  2. 使用 iOS 4 的 IBOutletCollection
于 2013-04-24T08:12:06.347 回答
0

对于全局应用样式,请考虑使用UIAppearance.

对于特定的视图控制器,IBOutletCollection这是最直接的方法——如果您使用的是 IB,那就是。如果不是,您可以创建一个NSArray包含所有要自定义的按钮的变量或属性,然后对其进行迭代。

你的 Python 代码最直接的翻译是

  1. 使用类别向 UIButton 添加方法,例如-[UIButton(YMStyling) ym_stylize]
  2. 然后调用[@[button1, button2, button3] makeObjectsPerformSelector:@selector(ym_stylize)].

这在 Cocoa/Obj-C 世界中是相当不自然的,所以我建议坚持使用上述更惯用的方法。在罗马时,等等……</p>

于 2013-04-24T08:19:37.160 回答
0

我想您可以简单地使用带有视图的 NSMutableArray。这是我为展示我的想法而制作的一个示例:

- (void)viewDidLoad {

    [super viewDidLoad];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 20, 40)];
    [view1 setBackgroundColor:[UIColor blackColor]];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(150, 100, 20, 40)];
    [view2 setBackgroundColor:[UIColor whiteColor]];
    UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 20, 40)];
    [view3 setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:view1];
    [self.view addSubview:view2];
    [self.view addSubview:view3];

    NSMutableArray *views = [NSMutableArray arrayWithObjects:view1, view2, view3, nil];

    [self changeViews:views];
}

-(void)changeViews:(NSMutableArray *)viewsArray {
    for (UIView *view in viewsArray) {
        [view setBackgroundColor:[UIColor blueColor]];//any changes you want to perform
    }
}
于 2013-04-24T08:22:59.080 回答