iOS从字符串引用IBOutlet

时间:2014-10-30 16:54:31

标签: ios

我如何从一个等于所述IBOutlet名称的字符串中引用或调用IBOutlet(UIImageView)?

@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UIImageView *image2;
@property (weak, nonatomic) IBOutlet UIImageView *image3;

NSArray nameArray = @[@"image1", @"image2", @"image3"];

//somthing that would act as below
[nameArray[0] image] = (UIImage) PredeterminedImage;

1 个答案:

答案 0 :(得分:2)

使用key-value coding。所以:

[self setValue:predeterminedImage forKey:nameArray[0]]

Objective-C完全反射;它在运行时知道其方法的名称,因为setter与属性名称有一个众所周知的关系,因此它可以通过字符串名称设置属性。

这就是NIB / XIB / Storyboard在现实生活中的加载方式。与其他平台不同,没有自动代码生成,只有数据。


至于iphonic的评论,你应该通过IBOutletCollection以更好的方式解决首要问题,我认为这可能是有效的。唯一可能的问题是出口收藏是无序的;最简单的解决方法是添加一个应用排序条件的自定义setter。 E.g。

// nobody else is going to own the array, so better make it strong
@property (nonatomic, strong) IBOutletCollection(UIImageView)
             NSArray *imageViews;

...

- (void)setImageViews:(NSArray *)imageViews
{
    _imageViews = [imageViews sortedArrayUsingDescriptors:
                @[[NSSortDescriptor
                    sortDescriptorWithKey:@"frame.origin.y" ascending:YES]]];
}