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];
}
¿Fue útil?

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.

  1. declarar MainView *drawBox; en .h
  2. en viewDidLoad, init como drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top