将 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 中已有的 NSObject 编接到派生类实例

正如我所料,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);
        }
    }
}

}