在MonoTouch中使用PerformSelector和@selector

本文关键字:PerformSelector @selector MonoTouch | 更新日期: 2023-09-27 18:30:06

我正在尝试将以下iOS代码转换为MonoTouch,但无法找到@selector(removebar)代码的正确转换。有人能提供关于处理@selector的最佳方法的指导吗(因为我在其他地方也遇到过):

- (void)keyboardWillShow:(NSNotification *)note {
[self performSelector:@selector(removeBar) withObject:nil afterDelay:0];
}

我的C#代码是:

NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification,
              notify => this.PerformSelector(...stuck...);

我基本上是想隐藏键盘上显示的上一个/下一个按钮。

提前感谢您的帮助。

在MonoTouch中使用PerformSelector和@selector

NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, removeBar);

其中CCD_ 1是在别处定义的方法。

void removeBar (NSNotification notification)
{
    //Do whatever you want here
}

或者,如果您喜欢使用lambda:

NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillShowNotification, 
                                                notify => { 
                                                    /* Do your stuffs here */
                                                });

Stephane展示了一种使用我们改进的绑定进行转换的方法。

让我分享一个更好的。您正在寻找的是一个键盘通知,我们方便地为其提供强类型,并将使您的生活更轻松:

http://iosapi.xamarin.com/?link=M%3aMonoTouch.UIKit.UIKeyboard%2bNotifications.ObserveWillShow

它包含一个完整的示例,向您展示如何访问为通知提供的强类型数据。

您必须考虑到:

[self performSelector:@selector(removeBar) withObject:nil afterDelay:0];

和完全一样

[self removeBar];

performSelector的调用只是一个使用反射的方法调用。因此,您真正需要翻译成C#的是以下代码:

- (void)keyboardWillShow:(NSNotification *)note {
    [self removeBar];
}

我想这也是通知订阅,总结为以下代码:

protected virtual void RegisterForKeyboardNotifications()
{
    NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, OnKeyboardNotification);
    NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, OnKeyboardNotification);
}
private void OnKeyboardNotification (NSNotification notification)
{
    var keyboardVisible = notification.Name == UIKeyboard.WillShowNotification;
    if (keyboardVisible) 
    {
        // Hide the bar
    }
    else
    {
        // Show the bar again
    }
}

您通常希望在ViewDidLoad上调用RegisterForKeyboardNotifications

干杯!