2012-04-07 89 views
0

我有一個第三方的OBJ-C庫(我寫的MonoTouch綁定),其通過內UIImagePickerControllerDelegateFinishedPickingMedia功能(ZBar iPhone SDK for those interested編組一個NSObject的已內MonoTouch的派生類的實例

NSDictionary參數返回數據

我綁定了我希望存儲在本字典中的實例的類(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 

所以是有可能在應用程序代碼中在名帥這些類如果是這樣,怎麼甚至更好,如果有人能?告訴我如何設置綁定,以便自動發生(但我不確定這是可能的)。

回答

2

正如我所料,MonoTouch運行時無法在編組時通過所有這些集合實例進行檢查,並且我的MonoTouch代碼只能看到字典中的一個NSObject實例(如果這個假設是錯誤的,它應該是一個ZBarSymbol insta有人請讓我知道)。

原來我錯了 - 即使在NSDictionarys中有實例,MonoTouch運行時也會爲您執行自動編組。

上面的問題是,它根本沒有返回ZBarSymbol - 它返回ZBarSymbolSet。如果你仔細觀察,這個例外實際上暗示了 - 「原因: - [ZBarSymbolSet data]:」

2

如果有人感興趣這個神祕的zBar委託如何工作......經過一番戰鬥.. zBarSymbolSet有一個IEnumerator!這會返回一個合適的ZBarSymbol,您可以使用.Data屬性來獲取結果條形碼。這也將其作爲subscribable事件傳遞:

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); 
     } 
    } 
} 



} 
相關問題