L'application se bloque après avoir essayé de mettre typedef enum
-
27-09-2019 - |
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];
}
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.
- déclare
MainView *drawBox;
dans .h - dans viewDidLoad, init comme
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- 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