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

时间:2016-02-03 14:29:15

标签: c# ios xamarin

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

User Defined Runtime Attributes

我已经看过几个关于如何在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;
    }
}

但是,它总是进入未定义的键部分并返回null。如何为键'bgType'检索字符串'Transparent'?

2 个答案:

答案 0 :(得分:2)

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

[Connect]
private NSString Stack { 
    get {
        return (NSString)GetNativeField ("Stack");
    }
    set {
        SetNativeField ("Stack", value);
    }
}

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

@property (nonatomic, retain) IBOutlet NSString *Stack;

定义属性值:

enter image description here

加载xib或情节提要时,此属性为自定义属性提供存储位置以供将来参考。

现在您可以通过ValueForKey

访问此值
partial void OnBottonUpInside (CustomButton sender) {
        NSString value = (NSString)sender.ValueForKey(new NSString("Stack"));
        Console.WriteLine(value);
}

输出示例:

2016-02-03 08:27:51.666 keyvalue[46492:2538387] OverFlow

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

partial void OnBottonUpInside (CustomButton sender)
{
    Console.WriteLine (sender.Stack);
}

注意:通常在ObjC中你只需要将它定义为一个强大的属性,但Xamarin不会这样定义它,但结果是"相同":

@property (strong) NSString *Stack;

答案 1 :(得分:0)

@SushuHangover的回答是正确的,仍然有效。但是,如果要避免使用不赞成使用的GetNativeField()和SetNativeField()方法,那么对我来说,这将是有效的更改:

[Connect]
private NSObject Stack
{
    get
    {
        return ValueForKey((NSString)"Stack");
    }
    set
    {
        SetValueForKey(value, (NSString)"Stack");
    }
}