将 MonoTouch 中已有的 NSObject 编接到派生类实例
本文关键字:派生 实例 NSObject MonoTouch | 更新日期: 2023-09-27 18:30:26
我有一个第三方Obj-C库(我已经为它编写了MonoTouch绑定),它通过UIImagePickerControllerDelegate
FinishedPickingMedia
函数中的NSDictionary
参数返回数据(ZBar iPhone SDK供感兴趣的人使用)
我已经绑定了我希望存储在此字典中的实例的类(ZBarSymbol
)。
正如我所料,MonoTouch 运行时在编组时不可能检查所有这些集合实例,我的 MonoTouch 代码只能在字典中看到NSObject
的实例(如果这个假设是错误的,它应该是一个ZBarSymbol
实例,有人可以告诉我吗)。
我尝试使用以下代码手动将NSObject
封送到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);
}
}
ZBarSymbol 的构造函数采用指针工作正常。但是,尝试访问任何成员(例如Data
属性)会导致以下异常:
MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown.
Name: NSInvalidArgumentException
Reason: -[ZBarSymbolSet data]: unrecognized selector sent to instance 0x8d2960
at ZBar.ZBarSymbol.get_Data () [0x00000] in <filename unknown>:0
at ZBarMonoTouchTest.ZBarMonoTouchTestViewController+BarcodeReaderCallback.FinishedPickingMedia (MonoTouch.UIKit.UIImagePickerController picker, MonoTouch.Foundation.NSDictionary info) [0x00197] in /Users/tyson/Projects/ZBarMonoTouchTest/ZBarMonoTouchTestViewController.cs:112
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
at ZBarMonoTouchTest.Application.Main (System.String[] args) [0x00000] in /Users/tyson/Projects/ZBarMonoTouchTest/Main.cs:17
那么是否可以在应用程序代码中封送这些类呢?如果是这样,如何?或者更好的是,如果有人可以告诉我如何设置绑定以便自动发生(但我不确定这是否可能)。
正如我所料,MonoTouch 运行时在编组时不可能检查所有这些集合实例,我的 MonoTouch 代码只在字典中看到 NSObject 的实例(如果这个假设是错误的,它应该是一个 ZBarSymbol 实例,有人可以告诉我吗)。
事实证明我错了 - MonoTouch 运行时将为您执行此自动编组,即使使用 NSDictionary 中的实例也是如此。
上面的问题是它根本没有返回ZBarSymbol
- 它返回了一个ZBarSymbolSet
.如果你仔细观察,异常实际上暗示了 - "原因:-[ZBarSymbolSet data]:"
如果有人对这个神秘的 zBar 代表如何工作感兴趣...... 经过一番战斗.. zBarSymbolSet 有一个 IEnumerator! 这将返回一个适当的 ZBarSymbol,您可以使用 .用于获取结果条形码的数据属性。 这也将其作为可订阅事件传递:
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);
}
}
}
}