0

我有一个第 3 方 Obj-C 库(我已经为其编写了 MonoTouch 绑定),它通过函数中的参数返回数据(NSDictionary感兴趣的人可以使用 ZBar iPhone SDKUIImagePickerControllerDelegateFinishedPickingMedia

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

正如我所料,MonoTouch 运行时在编组时不可能检查所有这些集合实例,并且我的 MonoTouch 代码只NSObject在字典中看到一个实例(如果这个假设是错误的,它应该是一个ZBarSymbol实例,有人可以让我知道)。

我尝试使用以下代码手动将NSObjectover 编组为 a :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  

那么是否可以在应用程序代码中编组这些类?如果是这样,怎么做?或者更好的是,如果有人可以告诉我如何设置绑定,以便自动发生(但我不确定这是否可能)。

4

2 回答 2

2

正如我所料,MonoTouch 运行时在编组时不可能检查所有这些集合实例,并且我的 MonoTouch 代码只在字典中看到 NSObject 的一个实例(如果这个假设是错误的,它应该是一个 ZBarSymbol 实例,有人可以请让我知道)。

结果我错了——MonoTouch 运行时会为你执行这个自动编组,即使是在 NSDictionarys 中的实例。

上面的问题是它根本没有返回 a ZBarSymbol- 它正在返回 a ZBarSymbolSet。如果您仔细观察,异常实际上暗示了这一点 - “原因:-[ZBarSymbolSet 数据]:”

于 2012-04-07T18:56:11.433 回答
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);
        }
    }
}



}
于 2012-12-05T10:58:27.140 回答