将MonoTouch中的NSObject编组为派生类实例

时间:2012-04-07 17:37:37

标签: c# xamarin.ios

我有一个第三方Obj-C库(我编写了MonoTouch绑定),它通过NSDictionary的{​​{1}}函数中的UIImagePickerControllerDelegate参数返回数据({{ 3}})

我已经绑定了我希望存储在这个字典中的实例的类(FinishedPickingMedia)。

正如我所料,MonoTouch运行时在编组时无法检查所有这些集合实例,而我的MonoTouch代码只在字典中看到ZBarSymbol的实例(如果这个假设错误且应该 NSObject个实例,有人可以告诉我。)

我尝试使用以下代码手动将ZBarSymbol封送到NSObject

ZBarSymbol

使用指针的ZBarSymbol的构造函数工作正常。但是,尝试访问任何成员(例如public override void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info) { var result = info[ZBarSDK.BarcodeResultsKey]; var symbol = result as ZBarSymbol; if ( symbol != null ) { // This never works obviously. } else { symbol = new ZBarSymbol(result.Handle); Console.WriteLine("Data = " + symbol.Data); } } 属性)会导致以下异常:

Data

那么可以在应用程序代码中封送这些类吗?如果是这样,怎么样?或者甚至更好,如果有人可以告诉我如何设置绑定,所以这会自动发生(但我不确定这是否可行)。

2 个答案:

答案 0 :(得分:2)

  

正如我所料,MonoTouch运行时在编组时无法检查所有这些集合实例,而我的MonoTouch代码只在字典中看到NSObject的实例(如果这个假设是错误的,它应该是ZBarSymbol实例,有人请告诉我。)

原来我错了 - 即使是NSDictionarys中的实例,MonoTouch运行时也会为您执行此自动编组。

上述问题是它根本没有返回ZBarSymbol - 它返回ZBarSymbolSet。如果仔细观察,异常实际暗示了 - “原因: - [ZBarSymbolSet数据]:”

答案 1 :(得分:2)

如果有人对这个神秘的zBar委托如何工作感兴趣......经过一番战斗...... zBarSymbolSet有一个IEnumerator!这将返回一个正确的ZBarSymbol,您可以使用.Data属性来获取结果条形码。这也将其作为可订阅的事件传递:

public class zScannerDelegate : ZBarReaderDelegate
{
public delegate void ScanResult(string scanstrring);
public event ScanResult ScannedCode;
public zScannerDelegate ()
{
}
public override void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info)
{

    ZBarSymbolSet result = null;

    string retstr = string.Empty;
    foreach (var sresult in info.Values) {
        if (sresult is ZBarSymbolSet) {
            result = sresult as ZBarSymbolSet;
            break;
        }
    }
    if (result != null) {
        foreach (var itema in result) {
            Console.WriteLine (itema.Data);
            retstr = itema.Data;
            ScanResult ret = ScannedCode;
            if (ret != null)
                ret(retstr);
        }
    }
}



}