2014-11-12 3 views
2

Я пытаюсь запустить событие touchupinside в Uibutton программно. Как я могу это сделать ? Код, который я пытался использует PerformSelector, но я получаю эту ошибкуКак стрелять TouchUpInside UIButton программно в xamarin ios C#

"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); 
} 
+0

Вы можете просто позвонить 'TouchUpInside (это, EventArgs.Empty);' или сделать вас по какой-то причине нужно пройти через реальное мероприятие? – jonathanpeppers

ответ

3

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

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

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

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

Еще один будет корректировать свой код, чтобы соответствовать как и требования, например,

// 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!"); 
} 
3

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

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside); 

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

Смежные вопросы