如何在Xamarin中以编程方式触发UIButton的TouchUpInside ios C#

我正尝试以编程方式触发Uibutton的touchupinside事件。 我怎样才能做到这一点 ? 我尝试的代码使用PerformSelector,但我得到这个错误

"Error MT4117: The registrar found a signature mismatch in the method 'VCPAckage2.ActivityViewController.TouchUpInsideEvent' - the selector 'TouchUpInsideEvent:' indicates the method takes 1 parameters, while the managed method has 2 parameters. " 

我想达到类似的东西

 UIButton.FireEvent("TouchUpInsideEvent") - this will fire the TouchUpInsideEvent UIButton.PerformSelector(new MonoTouch.ObjCRuntime.Selector ("TouchUpInsideEvent:"), null, 2000f); 

这是代码

  private void LoadFn() { UIButton btnSubmit = new UIButton(new RectangleF(0,0,View.Frame.Width,40)); btnSubmit.TouchUpInside+=TouchUpInsideEvent; } [Export("TouchUpInsideEvent:")] private void TouchUpInsideEvent(object sender,EventArgs e){ float yy = AppConstants.ZeroVal; if (FeedbackSubmittedReturnFlag == true) { yy = ChildScrollView2.Subviews[1].Frame.Height+ChildScrollView2.Subviews[1].Frame.Y; } this.ParentScrollView.SetContentOffset (new PointF (View.Frame.Width, yy), false); } 

上面有几个不同的东西。

首先, MT4117是正确的。 这是因为你的[Export]属性指定一个只有一个参数的方法的select器(即它只有一个:),而托pipe方法有两个参数(这是.NET事件的默认值)。 注册服务商将会发现这些情况并报告错误。

其次, PerformSelector方法绑定performSelector:...select器(大部分是在NSObject 协议上定义的,而不是类)。 因此,它们具有相同的限制(例如,它们可以处理的参数的数量)。

第三,有几种方法可以调用你自己的代码。 像@jonathanpeppersbuild议的那样,一个简单的方法就是在需要的时候直接调用你的托pipe方法。

另一个将是调整你的代码,以满足12的要求,例如

 // assign one (two parameters) method as a .NET event btnSubmit.TouchUpInside += TouchUpInsideEvent; ... // call another (one parameter) method like a selector any_nsobject.PerformSelector (new Selector ("TouchUpInsideEvent:"), sender as NSObject, 0f); ... // have the 2 parameters method call the(1 parameter) export'ed method private void TouchUpInsideEvent (object sender, EventArgs e) { TouchUpInsideEvent (sender as NSObject); } [Export ("TouchUpInsideEvent:")] private void TouchUpInsideEvent (NSObject sender) { Console.WriteLine ("yay!"); } 

下面的代码片段就足够了

 btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside); 

它必须从主线程调用