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

Я пытаюсь запустить приложение touchupinside в 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);
 }

Ответ 1

Там было несколько разных вещей.

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

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

В-третьих, есть несколько способов, которыми вы могли бы назвать свой собственный код. Легко было бы, например, предложить @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!");
}

Ответ 2

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

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

Он должен вызываться из основного потока