Question

J'avais posé une question similaire à cela avant, mais j'ai un nouveau problème avec elle, donc je l'ai Republiée partie de la question.

J'ai ceci avant la déclaration d'interface dans mon en-tête de MainView.h.

typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;

Je déclare (dans mon MainView) comme ceci:

Weather weather;

a ensuite fait un accesseur (et synthétisé il):

@property Weather weather;

Ma question est, comment puis-je utiliser dans MainViewController sans le faire tomber? J'ai importé l'en-tête pour MainView. J'ai essayé de l'utiliser comme ceci:

MainView* myView = (MainView*)self.view;

[myView setWeather: CLEAR];

Il ne me jette pas des erreurs dans Xcode, mais il se bloque lorsque le code est exécuté, en disant:

-[UIView setWeather:]: unrecognized selector sent to instance *blah*

Ai-je fait quelque chose de mal ici?

Dans mon MainViewController:

- (void)viewDidLoad {
    [super viewDidLoad];
    MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
    drawBox.backgroundColor = [UIColor clearColor];
    [self.view addSubview:drawBox];
}
Était-ce utile?

La solution

Vous avez ajouté le MainView comme sous-vue self.view. Lorsque vous passez setWeather, vous appelez en fait sur self.view (vue principale de votre contrôleur de vue, qui est un UIView), non pas sur la sous-vue de MainView de self.view.

Obtenir l'objet MainView correct par itérer self.view.subviews.

Edit: Ou tout simplement garder un Ivar pointant vers la sous-vue de MainView autour, vous pouvez y accéder à tout moment.

  1. déclare MainView *drawBox; dans .h
  2. dans viewDidLoad, init comme drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. il suffit d'appeler [drawBox setWeather:CLEAR]; lorsque vous devez

Autres conseils

En tant que suite à mon commentaire ci-dessus:

Vous êtes probablement dire quelque part, soit de [[UIView alloc] initWithFrame:...] ou si vous avez un fichier d'Interface Builder avec un objet Affichage. Si vous regardez dans la fenêtre d'inspecteur avec cet objet sélectionné, il indiquera son « identité de classe » comme UIView. Changez cette MainView si l'objet sera le type correct lors de l'exécution.

Vous devez déclarer la propriété à l'intérieur de la section @interface de MainView et vos besoins Weather weather; d'être dans la section variable d'instance de MainView ainsi.

MISE À JOUR: Dans votre viewDidLoad, vous ajoutez votre MainView en tant que sous-vue à votre VCs propriété view. Puis, quand vous voulez l'utiliser, vous obtenez le VCs propriété view, et jetant à un MainView. Vous n'êtes pas obtenir la vue que vous voulez quand vous le faites. Vous obtenez le point de vue qui est maintenant votre MainView. Ceci est la source de votre problème. self.view que vous faites référence, est un UIView pas MainView. Le MainView est une sous-vue self.view.

.m avez-vous Synthétiser la météo? par exemple.

@synthesize weather; 

de sorte que vous aurez le getter et setter créé.

[mise à jour] Après avoir lu votre mise à jour en viewDidLoad, il est clair que vous accédez à la vue erronée parce que vous avez simplement utilisé [self.view addSubview:], cela signifie que self.view n'est pas le MainView, il est juste un sous-vue . Vous pouvez simplement déclarer MainView * drawBox comme global et l'accès [drawBox setWeather:]. Directement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top