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

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.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top