C# 错误CS1540/CS0122:获取键盘大小不正确';切换到统一API后无法工作
今天我更新到Xamarin.iOS 8.6.0.51,并切换到新的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
统一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());