La aplicación se bloquea después de tratar de establecer typedef enum
-
27-09-2019 - |
Pregunta
Me había hecho una pregunta similar a esto antes, pero tengo un nuevo problema con él, así que he vuelto a publicar parte de la pregunta.
Tengo esto antes de la declaración de interfaz en mi cabecera MainView.h
.
typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;
Luego declaró (en mi MainView) como esto:
Weather weather;
Entonces hizo un descriptor de acceso (y sintetizó):
@property Weather weather;
Mi pregunta es, ¿cómo puedo usar esto en MainViewController
sin ella constantemente? He importado el encabezado de MainView.
He intentado utilizar de esta manera:
MainView* myView = (MainView*)self.view;
[myView setWeather: CLEAR];
No me tire cualquier error en Xcode, pero se bloquea cuando se ejecuta el código, diciendo:
-[UIView setWeather:]: unrecognized selector sent to instance *blah*
¿Estoy haciendo algo mal aquí?
En mi MainViewController:
- (void)viewDidLoad {
[super viewDidLoad];
MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
drawBox.backgroundColor = [UIColor clearColor];
[self.view addSubview:drawBox];
}
Solución
Se añade el MainView como subvista de self.view. Cuando se pasa setWeather, en realidad se está llamando en self.view (vista principal de su controlador de vista, que es un UIView), no en la subvista MainView de self.view.
Obtener el objeto MainView correcta por iteración a través de self.view.subviews.
Editar: O simplemente mantener un Ivar apuntando a la subvista MainView alrededor, para que pueda acceder a él en cualquier momento.
- declarar
MainView *drawBox;
en .h - en viewDidLoad, init como
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- simplemente llame
[drawBox setWeather:CLEAR];
cuando necesite
Otros consejos
Como seguimiento a mi comentario anterior:
Usted está diciendo probablemente, ya sea en algún lugar [[UIView alloc] initWithFrame:...]
o si tiene un archivo de Interface Builder con un objeto View. Si nos fijamos en la ventana de inspección con el objeto seleccionado, se indicará su "identidad de clase", como UIView
. Cambie esto a MainView
por lo que el objeto tendrá el tipo correcto en tiempo de ejecución.
Es necesario declarar la propiedad dentro de la sección de @interface
MainView
, y sus necesidades Weather weather;
a estar en la sección variable de instancia de MainView
también.
ACTUALIZACIÓN: En su viewDidLoad, va a añadir a su MainView como subvista a su propiedad VC view
. Entonces, cuando usted quiere usarlo, que está recibiendo la propiedad VC view
, y echándola a un MainView
. Que no está recibiendo la vista que desee cuando se hace eso. Que está recibiendo la opinión de que es la celebración de su MainView. Este es el origen del problema. self.view
como se está haciendo referencia a ella, no es un UIView un MainView. El MainView es una subvista de self.view.
.m en qué sintetizar tiempo? p.ej.
@synthesize weather;
de modo que usted tiene la getter y setter creado.
[Actualización] Después de leer su actualización en viewDidLoad, es evidente que está accediendo a la vista erróneo, ya que utiliza simplemente [addSubview self.view:], esto significa que no es el self.view MainView, es sólo una subvista . Puede declarar MainView * drawBox como global y el acceso [drawBox setWeather:]. Directamente