2015-01-13 2 views
4

Сегодня я обновился до Xamarin.iOS 8.6.0.51 и переключился на новый Unified API.Ошибка CS1540/CS0122: Получение клавиатуры не работает после переключения на унифицированный 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 '. Классификатор должен быть типа `MyApp.SomeViewController 'или производные от него (CS1540)

и

CS0122 Ошибка:` Foundation.NSValue.NSValue (System.IntPtr)' является недоступным из-за его уровня защиты (CS0122)

Как я могу это решить? Я могу удалить new NSValue(...), но RectangleFValue все еще не работает, и мне понадобится замена/другой способ.

Edit:

По jonathanpeppers я изменил мой код:

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

Это не выдаст ошибку больше, но я не могу проверить его дальше, потому что я нахожусь в процесс перехода на унифицированный API, и все еще есть некоторые ошибки для исправления.

ответ

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

Я пробовал ваш подход (см. Мой отредактированный вопрос), и он не вызывает ошибку в этом месте. Я дам вам галочку, если я смогу полностью проверить свое приложение. – testing

+0

Это работает для меня. –

1

В .ctor(IntPtr) Конструкторы в NSObject может быть неправильно и вызывает проблемы позже. Кроме того, как отмечали @jonathanpeppers, они не требовались для многих сценариев (например, этот).

Другой способ сделать это (например, если у вас нет ничего, кроме ручки), как documented here, использовать метод ObjCRuntime.Runtime.GetNSObject<T> (IntPtr). Это обеспечит правильное создание -подкласс NSObject.

Смежные вопросы