我有一个第三方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
那么可以在应用程序代码中封送这些类吗?如果是这样,怎么样?或者甚至更好,如果有人可以告诉我如何设置绑定,所以这会自动发生(但我不确定这是否可行)。
答案 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);
}
}
}
}