我努力讓我的第一個Xamarin綁定工作。我正在嘗試創建一個FlatUIKit庫的綁定:https://github.com/Grouper/FlatUIKit。Xamarin中Objective-c綁定的問題
我設法創建了上述項目的fat靜態庫(universal .a)。 我使用Objective Sharpie來爲我生成ApiDefinition.cs。 我在Xamarin中使用該ApiDefinition.cs創建了一個BindingProject(稍作修改以使項目編譯)。 我帶着這個新的.dll文件,並在一個新的項目中嘗試過。 從該.dll調用方法工作正常並編譯。但是,我在運行時遇到問題。所有對FlatUI_UIColor執行的靜態調用都返回null。這使得這個API不可用。
這裏是包含顏色的初始.H:
@interface的UIColor(FlatUI)
- (的UIColor *)colorFromHexCode:(的NSString *)十六進制串;
- (UIColor *)turquoiseColor;
- (UIColor *)greenSeaColor;
- (UIColor *)emerlandColor;
- (UIColor *)nephritisColor;
- (UIColor *)peterRiverColor;
- (UIColor *)belizeHoleColor;
- (UIColor *)amethystColor;
- (UIColor *)wisteriaColor;
- (UIColor *)wetAsphaltColor;
- (UIColor *)midnightBlueColor;
- (UIColor *)sunflowerColor;
- (UIColor *)tangerineColor;
- (UIColor *)carrotColor;
- (UIColor *)pumpkinColor;
- (UIColor *)alizarinColor;
- (UIColor *)pomegranateColor;
- (UIColor *)cloudsColor;
- (UIColor *)silverColor;
- (UIColor *)concreteColor;
(UIColor *)asbestosColor;
(的UIColor *)blendedColorWithForegroundColor:(的UIColor *)foregroundColor 的backgroundColor:(的UIColor *)的backgroundColor percentBlend:(CGFloat的)percentBlend;
@end
下面是客觀記號筆生產的綁定:
[Category, BaseType (typeof (UIColor))]
public partial interface FlatUI_UIColor {
[Static, Export ("colorFromHexCode:")]
UIColor ColorFromHexCode (string hexString);
[Static, Export ("turquoiseColor"), Verify ("ObjC method massaged into getter property", "/Users/jhondel/Projects/iOS Libraries/FlatUIKit/Classes/ios/UIColor+FlatUI.h", Line = 14)]
UIColor TurquoiseColor { get; }
[Static, Export ("greenSeaColor"), Verify ("ObjC method massaged into getter property", "/Users/jhondel/Projects/iOS Libraries/FlatUIKit/Classes/ios/UIColor+FlatUI.h", Line = 15)]
UIColor GreenSeaColor { get; }
/// ...
[Static, Export ("blendedColorWithForegroundColor:backgroundColor:percentBlend:")]
UIColor BlendedColorWithForegroundColor (UIColor foregroundColor, UIColor backgroundColor, float percentBlend);
}
在ApiDefintion.cs,我擺脫了驗證。
如果有幫助,這是初始庫.M:
@implementation UIColor (FlatUI)
// Thanks to http://stackoverflow.com/questions/3805177/how-to-convert-hex-rgb-color-codes-to-uicolor
+ (UIColor *) colorFromHexCode:(NSString *)hexString {
NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
if ([cleanString length] == 3) {
cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@",
[cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)],
[cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)],
[cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]];
}
if([cleanString length] == 6) {
cleanString = [cleanString stringByAppendingString:@"ff"];
}
unsigned int baseValue;
[[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue];
float red = ((baseValue >> 24) & 0xFF)/255.0f;
float green = ((baseValue >> 16) & 0xFF)/255.0f;
float blue = ((baseValue >> 8) & 0xFF)/255.0f;
float alpha = ((baseValue >> 0) & 0xFF)/255.0f;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
+ (UIColor *) turquoiseColor {
static UIColor *turquoise = nil;
static dispatch_once_t dispatchToken;
dispatch_once(&dispatchToken, ^{
turquoise = [UIColor colorFromHexCode:@"1ABC9C"];
});
return turquoise;
}
任何想法,爲什麼FlatUI_UIColor.GreenSeaColor(和其他人)返回NULL?
感謝您的幫助。 @jstedfast評論後
UPDATE:
感謝您的答覆。
我已經建立了使用生成文件的脂肪庫中 https://github.com/xamarin/monotouch-samples/blob/master/BindingSample/src/binding/Makefile。
它建立一個通用庫(收集armv7和i386)。
當我在Xamarin的綁定項目中導入這個.a時,它會自動生成LinkWith。在我的情況:
[assembly: LinkWith ("libXMBindingLibrarySampleUniversal.a", LinkTarget.ArmV7 | LinkTarget.Simulator, ForceLoad = true)]
庫僅使用「UIKit的」和「基金會」,而根據該文檔,不需要在LinkWith指定。
生成的.dll似乎很好。我可以訪問我的示例項目中的方法。我設法創建一個帶有標題的FlatUIButton,並在運行模擬器時看到標題。但是該按鈕不能被點擊並且是黑色的,因爲所有FlatUI_UIColor.X都返回null。我真的不知道發生了什麼事。
模擬器和設備有什麼不同嗎?有時你會在其中一箇中看到更好的錯誤消息。 –
我有同樣的問題(靜態= null)。 Xamarin.Binding項目可以很好地構建,並且我在構建模擬器時使用.dll的項目(但嘗試使用靜態屬性時會崩潰)以及它不會構建的設備。錯誤是:錯誤MT5211:本機鏈接失敗,未定義Objective-C類:_OBJC_CLASS _ $ _ IZettleSDK。如果'_OBJC_CLASS _ $ _ IZettleSDK'是來自第三方綁定的協議,請檢查它的api定義文件中是否存在[協議]屬性,否則驗證所有必要的框架已被引用並且本地庫已正確鏈接。 – Boris