错误 CS1540/CS0122:切换到统一后无法获取键盘大小 API
Error CS1540/CS0122: Getting keyboard size doesn't work after switching to Unified API
今天我更新到 Xamarin.iOS 8.6.0.51 并切换到新的 Unified API
.
现在我想获取键盘尺寸(此代码之前有效):
var val = new NSValue (notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey).Handle);
RectangleF keyboardSize = val.RectangleFValue;
在迁移工具的帮助下,RectangleF
被转换为 CGRect
,但我得到的错误是
Error CS1540: Cannot access protected member
Foundation.NSValue.NSValue(System.IntPtr)' via a qualifier of type
Foundation.NSValue'. The qualifier must be of type
`MyApp.SomeViewController' or derived from it (CS1540)
和
Error CS0122: `Foundation.NSValue.NSValue(System.IntPtr)' is
inaccessible due to its protection level (CS0122)
我该如何解决这个问题?我可以删除 new NSValue(...)
,但 RectangleFValue
仍然不起作用,我需要一个 replacement/another 方式。
编辑:
根据 jonathanpeppers 的说法,我将代码修改为:
NSValue keyboardFrameBegin = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
CGRect keyboardSize = keyboardFrameBegin.CGRectValue;
这不再引发错误,但我无法进一步测试它,因为我正在迁移到 Unified 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 提到的那样,很多场景(比如这个场景)都不需要它们。
另一种方法(例如,如果你除了句柄什么都没有),如 documented here,是使用 ObjCRuntime.Runtime.GetNSObject<T> (IntPtr)
方法。这将确保正确创建 NSObject
-子类。
今天我更新到 Xamarin.iOS 8.6.0.51 并切换到新的 Unified API
.
现在我想获取键盘尺寸(此代码之前有效):
var val = new NSValue (notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey).Handle);
RectangleF keyboardSize = val.RectangleFValue;
在迁移工具的帮助下,RectangleF
被转换为 CGRect
,但我得到的错误是
Error CS1540: Cannot access protected member
Foundation.NSValue.NSValue(System.IntPtr)' via a qualifier of type
Foundation.NSValue'. The qualifier must be of type `MyApp.SomeViewController' or derived from it (CS1540)
和
Error CS0122: `Foundation.NSValue.NSValue(System.IntPtr)' is inaccessible due to its protection level (CS0122)
我该如何解决这个问题?我可以删除 new NSValue(...)
,但 RectangleFValue
仍然不起作用,我需要一个 replacement/another 方式。
编辑:
根据 jonathanpeppers 的说法,我将代码修改为:
NSValue keyboardFrameBegin = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
CGRect keyboardSize = keyboardFrameBegin.CGRectValue;
这不再引发错误,但我无法进一步测试它,因为我正在迁移到 Unified 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 提到的那样,很多场景(比如这个场景)都不需要它们。
另一种方法(例如,如果你除了句柄什么都没有),如 documented here,是使用 ObjCRuntime.Runtime.GetNSObject<T> (IntPtr)
方法。这将确保正确创建 NSObject
-子类。