c# - samsung - Error CS1540/CS0122: obtener el tamaño del teclado no funciona después de cambiar a la API Unificada
se achico el teclado de mi samsung (2)
¿Puedes usar un elenco?
var val = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
RectangleF keyboardSize = val.RectangleFValue;
Raramente deberías tener problemas con los identificadores en Xamarin.iOS.
Para estar absolutamente seguro de a qué lanzar, depurar y ver cuál es el tipo subyacente primero:
NSObject val = notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
Console.WriteLine("Type: " + val.GetType());
Hoy actualicé a Xamarin.iOS 8.6.0.51 y cambié a la nueva Unified API
.
Ahora quiero obtener el tamaño del teclado (este código funcionó antes):
var val = new NSValue (notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey).Handle);
RectangleF keyboardSize = val.RectangleFValue;
Con la ayuda de la herramienta de migración, RectangleF
se convierte a CGRect
, pero los errores que CGRect
aquí son
Error CS1540: no se puede acceder al miembro protegido
Foundation.NSValue.NSValue(System.IntPtr)'' via a qualifier of type
Foundation.NSValue''. El calificador debe ser del tipo `MyApp.SomeViewController ''o derivado de él (CS1540)
y
Error CS0122: `Foundation.NSValue.NSValue (System.IntPtr) ''es inaccesible debido a su nivel de protección (CS0122)
¿Como puedo resolver esto? Puedo eliminar new NSValue(...)
, pero RectangleFValue
todavía no funciona y necesitaría un reemplazo / otra forma.
Editar:
De acuerdo con jonathanpeppers modifiqué mi código a:
NSValue keyboardFrameBegin = (NSValue)notification.UserInfo.ValueForKey (UIKeyboard.FrameBeginUserInfoKey);
CGRect keyboardSize = keyboardFrameBegin.CGRectValue;
Esto ya no arroja un error, pero no puedo probarlo más porque estoy en proceso de migrar a la API Unificada y todavía hay algunos errores que corregir.
Los .ctor(IntPtr)
en NSObject
podrían ser mal utilizados y NSObject
problemas más adelante. Además, como mencionó @jonathanpeppers, no fueron necesarios para muchos escenarios (como este).
Otra forma de hacerlo (por ejemplo, si no tiene nada más que un identificador), como se documenta aquí , es utilizar el ObjCRuntime.Runtime.GetNSObject<T> (IntPtr)
. Eso asegurará que el NSObject
-subclass se crea correctamente.