Как программно запустить TouchUpInside из UIButton в xamarin ios C#

Я пытаюсь программно запустить событие касания в Uibutton. Как я могу это сделать? Код, который я пробовал, использует 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);
 }

2 ответа

Следующий фрагмент кода будет достаточно

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

Это должно быть вызвано из основного потока

Есть несколько разных вещей выше.

Во-первых, MT4117 верно. Это происходит потому, что ваш [Export] Атрибут задает селектор для метода, который имеет только один параметр (т.е. он имеет только один :) в то время как управляемый метод имеет два параметра (который используется по умолчанию для событий.NET). Регистратор определит такие условия и сообщит об ошибках.

Во-вторых, PerformSelector методы привязаны performSelector:... селекторы (большинство определены на NSObject протокол, а не класс). Как таковые, они имеют те же ограничения (например, количество аргументов, которые они могут обработать).

В-третьих, есть несколько способов назвать свой собственный код. Легче всего было бы, как предложил @jonathanpeppers, напрямую вызывать управляемый метод при необходимости.

Другой вариант - настроить ваш код так, чтобы он соответствовал требованиям 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!");
}
Другие вопросы по тегам