Om du kikar i Xcode run log när du startar ditt program kan man se följande:
2007-04-05 10:12:17.194 windowsColourTest[27449] An uncaught exception was raised
2007-04-05 10:12:17.209 windowsColourTest[27449] *** -redComponent not defined for the NSColor NSCalibratedWhiteColorSpace 1 1; need to first convert colorspace.
2007-04-05 10:12:17.209 windowsColourTest[27449] *** Uncaught exception: <NSInvalidArgumentException> *** -redComponent not defined for the NSColor NSCalibratedWhiteColorSpace 1 1; need to first convert colorspace.
Du kan läsa mer om color spaces här, men lite kort kan man säga att du har fått en färg i en color space där du inte kan be om röda komponenten, och du måste konvertera den till något annat, lämpligen NSCalibratedRGBColorSpace:
- (void)changeColor
{
NSColor *color;
color = [[myColorPanel color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
[myWindow setBackgroundColor: color];
[myWindow display];
[redComponentTextField setFloatValue: [color redComponent]];
[greenComponentTextField setFloatValue: [color greenComponent]];
[blueComponentTextField setFloatValue: [color blueComponent]];
}
Det finns lite andra problem i din kod dock. Nån annan har redan tagit upp problemet med att ha en instansvariabel till NSColorPanel +sharedColorPanel. Nu råkar den vara en singleton så det fungerar, men det är mycket möjligt att den skulle kunna byta ut sig själv mot en annan instans av NSColorPanel senare, och då har du en sparad pekare till något som är deallokerat. Bättre att fråga efter +sharedColorPanel i varje metod du behöver använda den istället.
Din metod actionChangeColor tar ingen parameter, men actions ska alltid ta en parameter, sender. Definierar om den till - (void)actionChangeColor: (id)sender. Notera att actionChangeColor och actionChangeColor: är helt olika metoder. Du använder även NSSelectorFromString() i -setAction:, när du kan (och bör) använda @selector() istället:
[myColorPanel setAction: @selector(actionChangeColor:)];