이 호출에 대한 바인딩을 찾을 수 없습니다. 아래 샘플에서는 PerformSelector에 대한 자체 오버로드를 추가했습니다. 아마도 Xamarin 엔지니어 중 한 명이이 사실을 확인할 수 있습니다. MonoTouch docs
using System;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.ObjCRuntime;
using System.Runtime.InteropServices;
namespace delete20120506
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow (UIScreen.MainScreen.Bounds);
//
Target target = new Target();
NSUrl url = new NSUrl ("http://xamarin.com/");
NSData nsData = NSData.FromString ("Hello");
target.PerformSelector (new MonoTouch.ObjCRuntime.Selector
("TestSelUrl:withData:"), url, nsData);
window.MakeKeyAndVisible();
return true;
}
}
[Register ("Target")]
public class Target : NSObject
{
public Target() : base (NSObjectFlag.Empty) {}
[Export("TestSelUrl:withData:")]
void TestSelUrlWithData(NSUrl url, NSData nsData)
{
Console.WriteLine ("In TestSelUrlWithData");
Console.WriteLine (url.ToString());
Console.WriteLine (nsData.ToString());
return;
}
[DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSend")]
public static extern void void_objc_msgSend_intptr_intptr_intptr (IntPtr receiver, IntPtr selector, IntPtr arg1, IntPtr arg2, IntPtr arg3);
[DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSendSuper")]
public static extern void void_objc_msgSendSuper_intptr_intptr_intptr (IntPtr receiver, IntPtr selector, IntPtr arg1, IntPtr arg2, IntPtr arg3);
public virtual void PerformSelector (MonoTouch.ObjCRuntime.Selector sel,
NSObject arg1, NSObject arg2)
{
if (this.IsDirectBinding)
{
void_objc_msgSend_intptr_intptr_intptr (this.Handle,
Selector.GetHandle ("performSelector:withObject:withObject:"),
sel.Handle, arg1.Handle, arg2.Handle);
}
else
{
void_objc_msgSendSuper_intptr_intptr_intptr (this.SuperHandle,
Selector.GetHandle ("performSelector:withObject:withObject:"), sel.Handle,
arg1.Handle, arg2.Handle);
}
}
}
}
철저한 답변을 해주셔서 감사합니다. 코코아가 화면을 다시 그리기 위해 메인 스레드를 비울 필요가있을 때 PerformSelector를 사용했습니다. 그런 다음 일부 논리 처리로 돌아갈 수있었습니다. 지금은 내가 가지고있는 루프에 대한 writeStream 중에 화면에 그려진 진행 막대의 해당 항목을 업데이트하려고합니다. for 루프 내에 perform selector를 놓고 진행 막대의 속성을 업데이트하여 화면을 본질적으로 새로 고칠 수 있는지 확인하고 싶습니다. –
또 다른 방법은 논리/스트림에 스레드를 사용하고 스레드에서 InvokeOnMainThread를 사용하여 UI를 업데이트하는 것입니다. –
원본 개발자가 특정 속성을 바인딩하지 않았거나 소스를 릴리스하지 않았기 때문에 수동으로 라이브러리를 리 바인드하지 않아도되었습니다. 감사합니다. 관심있는 사람은 setColor를 호출하여 msgSend_IntPtr_IntPtr 메서드를 사용하여 속성을 쉽게 설정할 수 있습니다. 여기서 color는 속성의 이름입니다. (Arg 0은 속성 값입니다. Arg 1 = IntPtr.Zero) – Dermot