Objective-C | Outlet Collection OSX

时间:2015-06-30 08:50:08

标签: objective-c xcode macos iboutlet applescript-objc

基本上我的项目中有一堆变量,其名称相同,只有一个数字不同。我必须编写一个代码,对于所有变量几乎都是相同的,但数字会发生变化。实际问题是所有这些变量都出口连接到IB中的对象。 例如:

-(IBAction)setImages:(id)sender {

   int key = (int)[sender tag];
   if (key == 1) {
    [imageView1 setImage:myImage];
   } else if (key == 2) {
    [imageView2 setImage:myImage];
   } else if (key == 3) {
    [imageView3 setImage:myImage];
   }

}

我想要的是:

-(IBAction)setImages:(id)sender {

    int key = (int)[sender tag];
    [imageView(key) setImage:myImage];

}

这只是一个例子,不是我的代码中的实际内容,而是在AppleScriptObjC中编写。

任何帮助都会非常感激!

提前致谢

[编辑代码以更好地解释我的需要]

2 个答案:

答案 0 :(得分:0)

sender是按钮对象,只需使用它。

-(IBAction)setNames:(id)sender {

    int key = (int)[sender tag];
    [sender setTitle:[NSString stringWithFormat:@"Clicked Button %d", key]];
}

修改:好的,我看到你改变了问题中的代码。如何构建一个将按钮标签与图像视图相关联的字典?所以,像这样:

@property( strong, nonatomic ) NSMutableDictionary* imageViews;

...

- (void) viewDidLoad {
    // Set up the dictionary here.
    self.imageViews = [NSMutableDictionary dictionary];
    self.imageViews[@(1)] = imageView1;
    self.imageViews[@(2)] = imageView2;
    ...
    self.imageViews[@(20)] = imageView20;
}

- (IBAction) setImages:(id)sender {
    int key = (int)[sender tag];
    NSImageView* imageView = self.imageViews[@(key)];
    [imageView setImage:myImage];
}

答案 1 :(得分:0)

您可以使用键值编码:

-(IBAction)setImages:(id)sender {
   int tag = (int)[sender tag];
   NSString* key = [NSString stringWithFormat:@"imageView%d", tag];
   NSImageView* imageView = [self valueForKey:key];
   imageView.image = myImage;
}

或者,大致相当于:

-(IBAction)setImages:(id)sender {
   int tag = (int)[sender tag];
   NSString* keyPath = [NSString stringWithFormat:@"imageView%d.image", tag];
   [self setValue:myImage forKeyPath:keyPath];
}