在MonoTouch中使用带有@selector的PerformSelector

时间:2013-09-02 19:55:27

标签: c# ios xamarin.ios performselector

我正在尝试将以下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...);

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

你必须考虑到:

[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
    }
}

您通常希望在RegisterForKeyboardNotifications上致电ViewDidLoad

干杯!