我正在尝试使用霍尼韦尔Captuvo SDK并收集我需要设置一个委托调用来处理来自扫描程序的请求但是当我这个代码时它会导致找不到选择器的#34;方法签名[setCaptuvoEventsProtocol: ]目标null"在setProperty行:
Pointer captuvoShared =eval("Captuvo.sharedCaptuvoDevice").asPointer();
if (captuvoShared!=null)
{
Objc.DelegateObject delegate = Objc.makeDelegate()
.add("captuvoConnected", Method.create(Method.ArgType.Void ,args->
{
Log.p("Connected");
return null;
}));
Objc.setProperty(captuvoShared, "CaptuvoEventsProtocol", delegate);
}
else
Log.p("Captuvo null!");
答案 0 :(得分:1)
此错误表示Captuvo类不响应消息“setCaptuvoEventsProtocol”。查看header for the Captuvo SDK,您的意思是调用addCaptuvoDelegate:
消息。
E.g。
Objc.eval(captuvoShared, "addCaptuvoDelegate:", delegate);
注意:Objc.setProperty()
只应用于设置对象的属性。要发送消息时使用Objc.eval()
。 Objc.setProperty()
实际上只是将属性名称转换为相应的setPropName
消息的糖。例如。如果您致电Objc.setProperty(myObject, "name", "Steve")
,则只需致电Objc.eval(myObject, "setName:", "Steve")
。如果没有setName:
消息,则没有可写的“name”属性。
另一个注意事项:最好使用Objc.isNull(myPointer)
而不是myPointer == null
,因为它还会检查它与Objective-c的Pointer
nil
的情况。< / p>
您需要更改的另一件事是Method.create()
电话。由于captuvoConnected
协议的CaptuvoEventsProtocol
消息具有无效返回值并且采用无参数,因此您需要执行以下操作:
.add("captuvoConnected", Method.create(Method.ArgType.Void , new Method.ArgType[0], args->
{
Log.p("Connected");
return null;
}));
注意那里的第二个参数。我刚刚更新了CN1ObjcBridge lib以创建另一个变体,这将使这更容易:
.add("captuvoConnected", Method.create(args->
{
Log.p("Connected");
return null;
}));
如果您想使用此简化语法,可以从here下载最新的CN1ObjCBridge.cn1lib,或者等待几天,以便在Codename One设置中使用。