ここから sourceforge でダウンロードした ZBarMonotouchBinding の v2 を使用しています。このバージョンには libzbar.a ファイルが付属していなかったので、バインディングの v1 の libzbar.a ファイルを使用しています (これが問題の原因である可能性があります??)。バインディングをダウンロードした後、サンプル アプリに ZBar.dll 参照をコンパイルして追加しました。
サンプル アプリのデリゲートには、こちらの stackoverflow で見つけたコードを使用しています。
サンプル アプリでは、スキャナーを表示してバーコードを認識させることに問題はありませんが、バーコードを認識してデリゲートにシンボル データを返す必要があるとすぐに、FinishedPickingMedia イベントを呼び出す代わりに、この例外が発生します。デリゲートで:
Objective-C exception thrown. Name: NSInvalidArgumentException Reason: -[ZBar.ZBarReaderViewController+_ZBarReaderDelegate imagePickerController:didFinishPickingMediaWithInfo:]: unrecognized selector sent to instance
0xe2a130
MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: -[ZBar.ZBarReaderViewController+_ZBarReaderDelegate imagePickerController:didFinishPickingMediaWithInfo:]: unrecognized selector sent to instance 0xe2a130
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:43
at Scanner.Application.Main (System.String[] args) [0x00000] in /Users/user/Projects/sample/scanner/Main.cs:16
FinishedPickingMedia イベントが見つからないようですが、動作していると言われている借用コードなので、コーディングの問題ではないと思います。念のため、私が使用しているソースコードは次のとおりです。
コントローラ:
public class ScannerViewController : ZBarReaderViewController
{
public ScannerViewController ()
{
this.SupportedOrientations = ZBarOrientation.All;
this.ShowBarcodeTracker = true;
this.ShowsZBarControls = true;
this.ReaderDelegate = new zScannerDelegate();
}
}
代理人:
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);
}
}
}
}
問題を引き起こしているバインディングの v1 から借用しなければならなかった libzar.a ファイルでしょうか? libzar.a ファイルの更新されたバージョンをどこで入手できるか、またはこのエラーを回避するために何ができるか考えていますか?
一日中調査しましたが、残念ながら、ZBar と Monotouch について参照できるコード サンプルは多くありません。