错误CS1540 / CS0122:切换到Unified API后,获取键盘大小不起作用

时间:2015-01-13 12:55:48

标签: c# ios xamarin.ios xamarin uikeyboard

今天我更新了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 Foundation.NSValue&#39 ;.限定符必须是类型   `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;

这不再引发错误,但我无法进一步测试,因为我正在迁移到Unified API,但仍有一些错误要纠正。

2 个答案:

答案 0 :(得分:8)

你能使用演员:

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());

答案 1 :(得分:1)

.ctor(IntPtr)中的NSObject构造函数可能会被滥用并导致问题。此外,就像@jonathanpeppers提到的那样,它们在很多场景中都不是必需的(比如这个场景)。

另一种方法(例如,除了句柄之外别无其他),documented here就是使用ObjCRuntime.Runtime.GetNSObject<T> (IntPtr)方法。这将确保正确创建NSObject - 子类。