古いシステムで10.9でNSColorの新しく追加されたメソッドをサポートしようとしています。 Pre-10.9私はMacとiOSの間でコードを統一することができるカテゴリに入れました。 10.9にはこれらのメソッドがあるので、どこでも私は使い方が変わってしまいます。これらのメソッドを古いランタイムに動的に追加したいのですが、class_addMethodを使用してこれを行う方法についていくつかの参照が見つかりました。問題は、addMethodが成功を返しても、メソッドは呼び出されないということです。実行時にクラスにObjective-Cメソッドを追加する
NSColor *
fColorWithWhite(id self, SEL _cmd, float white, float alpha) {
return [NSColor colorWithDeviceWhite: white
alpha: alpha];
}
NSColor *
fColorWithRedGreenBlue(id self, SEL _cmd, float red, float green, float blue, float alpha) {
return [NSColor colorWithDeviceRed: red
green: green
blue: blue
alpha: alpha];
}
+ (void)addLegacySupport {
Class class = NSClassFromString(@"NSColor");
BOOL success = class_addMethod(class, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff");
NSLog(@"colorWithWhite:alpha: - %i", success);
success = class_addMethod(class, @selector(colorWithRed:green:blue:alpha:), (IMP)fColorWithRedGreenBlue, "@@:ffff");
NSLog(@"colorWithRed:green:blue:alpha: - %i", success);
}
いずれのポインタも高く評価されます。
これはとても驚きました。私はAPIドキュメントでそれを見ていないとは思えませんでしたが、class_addMethodでもfalseを返しました。 – greg
解決済み:上記は機能しました。根本的な問題は、CGFloatをfloatに二重にキャストすることと関連していました。 – greg