我正在将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)/