如何在 Xamarin 中检索用户定义的运行时属性?

Dav*_*ave 2 c# ios xamarin

在我的 XCode 故事板上,我有一个自定义图像视图(称为 CustomImageButton)。有一个关于用户定义的运行时属性的部分:

用户定义的运行时属性

我看过几个有关如何在 Objective-C 中检索这些值的示例,但无法弄清楚如何转换为 Xamarin C#。我正在使用的代码是:

class CustomImageButton : UIImageView
{
    public CustomImageButton(IntPtr handle) : base(handle)
    {
        NSObject objType = ValueForKey(new NSString("bgType"));
        if (objType == null)
            // Do something here
    }

    public override NSObject ValueForUndefinedKey(NSString key)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,它总是进入未定义的关键部分并返回 null。如何检索键“bgType”的字符串“Transparent”?

Sus*_*ver 5

在自定义(基于 C# 的)UI 类中,为自定义用户定义的运行时属性添加一个属性。

[Connect]
private NSString Stack { 
    get {
        return (NSString)GetNativeField ("Stack");
    }
    set {
        SetNativeField ("Stack", value);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将依次在您的 ObjC 自定义类头文件中自动生成属性:

@property (nonatomic, retain) IBOutlet NSString *Stack;
Run Code Online (Sandbox Code Playgroud)

定义你的属性值:

在此输入图像描述

当 xib 或 Storyboard 加载时,此属性为自定义属性提供一个存储位置以供将来参考。

现在您可以通过以下方式访问该值ValueForKey

partial void OnBottonUpInside (CustomButton sender) {
        NSString value = (NSString)sender.ValueForKey(new NSString("Stack"));
        Console.WriteLine(value);
}
Run Code Online (Sandbox Code Playgroud)

输出示例:

2016-02-03 08:27:51.666 keyvalue[46492:2538387] OverFlow
Run Code Online (Sandbox Code Playgroud)

当然,我可以将该属性定义为公共属性并以这种方式访问​​它:

partial void OnBottonUpInside (CustomButton sender)
{
    Console.WriteLine (sender.Stack);
}
Run Code Online (Sandbox Code Playgroud)

注意:通常在 ObjC 中,您只需将其定义为强属性,但 Xamarin 并没有这样定义,但结果是“相同”:

@property (strong) NSString *Stack;
Run Code Online (Sandbox Code Playgroud)