我正在将Objective-C代码转换为Xamarion.iOS。

在Objective-C中,我有以下代码。

- (void)keyboardWasShown: (NSNotification*)aNotification
{
  NSDictionary* info = [aNotification userInfo];
  CGSize kbSize = [[info objectForKey:UIKeyboadFrameBeginUserInfoKey] CGRectValue].size;
  . . .
}

问题是info objectForKey返回一个具有CGRectValue方法的Id对象。

但是在Xamarin中,我有...
private void KeyboardWasShown(NSNotification notification)
{
   var info = notification.UserInfo;
   var kbSize = (info.ObjectForKey(UIKit.UIKeyboard.FrameBeginUserInfoKey)).??
 . . .
}

在Xamarin中,NSDictionary返回一个NSObject,但是Objective-C版本返回一个Id对象。 NSObject没有方法CGRectValue。

我的问题是Xamarin对Id对象做了什么,我应该强制转换什么类以获得CGRectValue。我尝试过转换为UIView,但这没有帮助,除非我错过了一些东西。

我已经尝试使用谷歌搜索,但是我在iOSDevice Id上获得了很多成功。

编辑:
我还没有机会进行测试,但是我想我找到了一种可能的方法。
var kbSize = ((UIView) info.ObjectForKey(UIKit.UIKeyboard.FrameBeginUserInfoKey)).Frame.Size;

我需要花费一些时间才能测试从该ID返回的对象是否为UIView类型。

最佳答案

在Xamarin中,您可以使用强类型的通知,这些通知将为您提供所需的全部信息,而无需对数据进行拆箱。

请参见此处的示例:http://developer.xamarin.com/api/type/MonoTouch.UIKit.UIKeyboard/

在您的情况下,您不需要ObserveDidChangeFrame,而是想要ObserveDidShow,但是想法是相同的。

就是说,如果您仍然想使用其他方法,则ObjectForKey调用中产生的值是NSValue,因此您要做的就是将结果转换为NSValue,然后使用CGRectValue属性。

更新:指向所需样本的完整链接:

http://developer.xamarin.com/api/member/MonoTouch.UIKit.UIKeyboard+Notifications.ObserveDidShow(System.EventHandler%7BMonoTouch.UIKit.UIKeyboardEventArgs%7D)/

10-08 12:38
查看更多