C# 错误CS1540/CS0122:获取键盘大小不正确';切换到统一API后无法工作

C# 错误CS1540/CS0122:获取键盘大小不正确';切换到统一API后无法工作,c#,ios,xamarin.ios,xamarin,uikeyboard,C#,Ios,Xamarin.ios,Xamarin,Uikeyboard,今天我更新到Xamarin.iOS 8.6.0.51,并切换到新的统一API 现在我想获得键盘大小(此代码以前工作过): 在迁移工具的帮助下,RectangleF被转换为CGRect,但是我这里得到的错误是 错误CS1540:无法访问受保护的成员 Foundation.NSValue.NSValue(System.IntPtr)”通过类型的限定符 Foundation.NSValue'。限定符的类型必须为 `MyApp.SomeViewController'或从中派生(CS1540) 及 错误C

今天我更新到Xamarin.iOS 8.6.0.51,并切换到新的
统一API

现在我想获得键盘大小(此代码以前工作过):

在迁移工具的帮助下,
RectangleF
被转换为
CGRect
,但是我这里得到的错误是

错误CS1540:无法访问受保护的成员
Foundation.NSValue.NSValue(System.IntPtr)”通过类型的限定符
Foundation.NSValue'。限定符的类型必须为 `MyApp.SomeViewController'或从中派生(CS1540)

错误CS0122:'Foundation.NSValue.NSValue(System.IntPtr)' 由于其保护级别(CS0122)而无法访问

我怎样才能解决这个问题?我可以删除
新的NSValue(…)
,但
矩形值仍然不起作用,我需要一种替换方法/另一种方法

编辑:

根据jonathanpeppers的说法,我将代码修改为:

NSValue keyboardFrameBegin = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
CGRect keyboardSize = keyboardFrameBegin.CGRectValue;

这不会再抛出错误,但我无法进一步测试它,因为我正在迁移到统一API的过程中,还有一些错误需要更正。

您可以使用强制转换吗:

var val = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
RectangleF keyboardSize = val.RectangleFValue;
在Xamarin.iOS中,您很少需要处理句柄

要绝对确定强制转换的对象,请首先调试并查看基础类型:

NSObject val = notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
Console.WriteLine("Type: " + val.GetType());
NSObject
中的
.ctor(IntPtr)
构造函数可能被误用,并在以后引起问题。此外,就像提到的@jonathanpeppers一样,很多场景(如本场景)都不需要它们

另一种方法是使用
ObjCRuntime.Runtime.GetNSObject(IntPtr)
方法。这将确保正确创建
NSObject
-子类。

我尝试了您的方法(请参见我编辑的问题),但它不会在此处抛出错误。如果我能够完全测试我的应用程序,我会给你打勾。
NSObject val = notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
Console.WriteLine("Type: " + val.GetType());