将NSButton IBOutlet名称存储在数组中然后在NSButton上访问数组到setImage时出错

时间:2016-10-31 22:43:11

标签: objective-c macos nsarray nsbutton

请帮助。我的窗口中有4个NSButton(配置为Gradient样式),根据用户输入,我将按钮的颜色设为四种不同颜色之一(通过使用.png文件的setImage)。我的代码工作正常:

if ([[ranColors objectAtIndex:0] isEqualToString:@"red"]) {
    [color1 setImage:[NSImage imageNamed:@"Red.png"]];
}
else if ([[ranColors objectAtIndex:0] isEqualToString:@"yellow"]) {
    [color1 setImage:[NSImage imageNamed:@"Yellow.png"]];
}
else if ([[ranColors objectAtIndex:0] isEqualToString:@"blue"]) {
    [color1 setImage:[NSImage imageNamed:@"Blue.png"]];
}
else {
    [color1 setImage:[NSImage imageNamed:@"Green.png"]];
}

我为4个按钮(color1,color2,color3和color4)重复此代码4次。 ranColors是一个保存用户颜色选择的数组。

我试图通过使用NSArray来保持按钮IBOutlet名称:color1,color2,color3和color4,然后使用for循环在4个周期内进行交互来简化代码。这是代码:

for (int x = 0; x < 4; ++x) {
if ([[ranColors objectAtIndex:x] isEqualToString:@"red"]) {
    [[revealPositions objectAtIndex:x] setImage:[NSImage imageNamed:@"Red.png"]];
    }
else if ([[ranColors objectAtIndex:x] isEqualToString:@"yellow"]) {
    [[revealPositions objectAtIndex:x] setImage:[NSImage imageNamed:@"Yellow.png"]];
    }
else if ([[ranColors objectAtIndex:x] isEqualToString:@"blue"]) {
    [[revealPositions objectAtIndex:x] setImage:[NSImage imageNamed:@"Blue.png"]];
    }
else {
    [[revealPositions objectAtIndex:x] setImage:[NSImage imageNamed:@"Green.png"]];
    }
}

我收到错误:[__ NSCFConstantString setImage:]:无法识别的选择器发送到实例0x100006098。当我读取数组元素然后尝试将setImage设置为正确的文件时,会发生错误。看来我无法在按钮中存储按钮的IBOutlet名称,然后访问该名称并为其设置属性。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您将字符串设置为与文件名相同,则可以设置所有颜色而无需循环。

[color1 setImage:[NSImage imageNamed:[NSString stringWithFormat:@"%@.png",[ranColors objectAtIndex:0]]]];
[color2 setImage:[NSImage imageNamed:[NSString stringWithFormat:@"%@.png",[ranColors objectAtIndex:1]]]];
[color3 setImage:[NSImage imageNamed:[NSString stringWithFormat:@"%@.png",[ranColors objectAtIndex:2]]]];
[color4 setImage:[NSImage imageNamed:[NSString stringWithFormat:@"%@.png",[ranColors objectAtIndex:3]]]];

您确定[revealPositions objectAtIndex:x]存储NSButton将代码存放在该阵列中的UIButton以便澄清。

如果有效,可以回复。