错误 CS1540/CS0122:切换到统一 API 后,无法获取键盘大小

本文关键字:获取 键盘 API CS0122 CS1540 错误 | 更新日期: 2023-09-27 18:37:24

今天我更新到Xamarin.iOS 8.6.0.51并切换到新的Unified API

现在我想获取键盘大小(这段代码以前有效):

var val = new NSValue (notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey).Handle);
RectangleF keyboardSize = val.RectangleFValue;

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

错误 CS1540:无法访问受保护的成员 Foundation.NSValue.NSValue(System.IntPtr)' via a qualifier of type 基金会。限定符的类型必须为 "MyApp.SomeViewController"或派生自它 (CS1540)

错误 CS0122: "Foundation.NSValue.NSValue(System.IntPtr)" 是 由于其防护等级而无法访问 (CS0122)

我该如何解决这个问题?我可以删除new NSValue(...),但RectangleFValue仍然不起作用,我需要更换/另一种方式。

编辑:

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

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

这不会再引发错误,但我无法进一步测试它,因为我正在迁移到统一 API,并且仍然有一些错误需要纠正。

错误 CS1540/CS0122:切换到统一 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<T> (IntPtr) 方法。这将确保正确创建NSObject子类。