Falha no aplicativo depois de tentar definir o typedef enum
-
27-09-2019 - |
Pergunta
Eu já tinha feito uma pergunta semelhante a isso antes, mas tenho um novo problema com ele, então republicei parte da pergunta.
Eu tenho isso antes da declaração da interface no meu MainView.h
cabeçalho.
typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;
Então eu o declarei (no meu MainView) assim:
Weather weather;
Em seguida, fez um acessador (e sintetizou):
@property Weather weather;
Minha pergunta é: como posso usar isso em MainViewController
sem travar? Eu importei o cabeçalho para MainView. Eu tentei usá -lo assim:
MainView* myView = (MainView*)self.view;
[myView setWeather: CLEAR];
Não me lança nenhum erro no Xcode, mas trava quando o código é executado, dizendo:
-[UIView setWeather:]: unrecognized selector sent to instance *blah*
Estou fazendo algo errado aqui?
No meu MainViewController:
- (void)viewDidLoad {
[super viewDidLoad];
MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
drawBox.backgroundColor = [UIColor clearColor];
[self.view addSubview:drawBox];
}
Solução
Você adicionou o MainView como uma subjusta do Self.View. Quando você passa o SetWeather, você está realmente chamando no Self.View (Visualização principal do seu controlador de exibição, que é um UIView), não na subview MainView do Self.View.
Obtenha o objeto MainView correto, iterando através do self.View.subViewS.
Editar: ou apenas mantenha um adar apontando para a subview MainView, para que você possa acessá -lo a qualquer momento.
- declarar
MainView *drawBox;
em .h - em ViewDidload, init como
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- Basta ligar
[drawBox setWeather:CLEAR];
Quando você precisa
Outras dicas
Como acompanhamento do meu comentário acima:
Você provavelmente está dizendo [[UIView alloc] initWithFrame:...]
Em algum lugar ou você tem um arquivo de construtor de interface com um objeto de exibição. Se você olhar na janela do inspetor com esse objeto selecionado, ele indicará sua "identidade de classe" como UIView
. Mude isso para MainView
Portanto, o objeto terá o tipo correto em tempo de execução.
Você precisa declarar a propriedade dentro do @interface
Seção de MainView
, e seu Weather weather;
precisa estar na seção variável de instância de MainView
também.
ATUALIZA view
propriedade. Então, quando você quiser usá -lo, você está recebendo os VCs view
propriedade e lançando -a para um MainView
. Você não está obtendo a visão que deseja quando faz isso. Você está obtendo a visão que está segurando seu MainView. Esta é a fonte do seu problema. self.view
Como você está referenciando, é um UIView não é um MainView. O MainView é uma subjusta do self.View.
em .m você sintetizou o tempo? por exemplo
@synthesize weather;
para que você tenha o getter e o setter criados.
Atualização] Depois de ler sua atualização no ViewDidload, fica claro que você está acessando a visualização errada porque simplesmente usou [self.View AddSubView:], isso significa que o self.view não é o MainView, é apenas uma subview. Você pode apenas declarar MainView * DrawBox como um global e acessar [Drawbox setWeather:] diretamente.