如何在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方法。
另一个将是调整你的代码,以满足1和2的要求,例如
// 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);
它必须从主线程调用