Domanda

I aveva fatto una domanda simile a questo prima, ma ho un nuovo problema con esso in modo che ho ripubblicato parte della domanda.

Ho questo prima della dichiarazione di interfaccia nel mio header MainView.h.

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

Poi ho dichiarato che (a mio MainView) in questo modo:

Weather weather;

Poi ha fatto una funzione di accesso (e sintetizzato):

@property Weather weather;

La mia domanda è: come posso io uso questo in MainViewController senza schiantarsi? ho importato l'intestazione per MainView. Ho cercato di usare in questo modo:

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

[myView setWeather: CLEAR];

E non buttarmi eventuali errori di Xcode, ma si blocca quando viene eseguito il codice, dicendo:

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

sto facendo qualcosa di sbagliato qui?

Nel mio MainViewController:

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

Soluzione

È aggiunto il MainView come una visualizzazione secondaria di self.view. Quando si passa setWeather, in realtà si sta chiamando sul self.view (vista principale del vostro controller della vista, che è un UIView), non sulla visualizzazione secondaria MainView di self.view.

Prendi l'oggetto MainView corretto scorrendo self.view.subviews.

Modifica: O solo tenere d'Ivar punta alla visualizzazione secondaria MainView intorno, in modo da poter accedere in qualsiasi momento.

  1. declare MainView *drawBox; in .h
  2. in viewDidLoad, init come drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. semplicemente chiamare [drawBox setWeather:CLEAR]; quando è necessario

Altri suggerimenti

Come un follow-up per il mio commento sopra:

probabilmente stai dicendo sia [[UIView alloc] initWithFrame:...] da qualche parte o si dispone di un file di Interface Builder con un oggetto View. Se si guarda nella finestra di ispezione con quella oggetto selezionato, indicherà la sua "classe Identity", come UIView. Cambiare questo per MainView modo che l'oggetto avrà il tipo corretto in fase di esecuzione.

È necessario dichiarare la proprietà all'interno della sezione @interface di MainView, e le vostre esigenze Weather weather; di essere nella sezione variabile di istanza di MainView pure.

UPDATE: Nel vostro viewDidLoad, si sta aggiungendo il tuo MainView come una visualizzazione secondaria per la vostra proprietà VC view. Poi, quando si desidera utilizzarlo, che stai ricevendo la proprietà VC view, e il cast a un MainView. Non stai ricevendo la vista che si desidera quando fai così. Stai diventando l'idea che sta tenendo il MainView. Questa è la causa del problema. self.view come si sta riferimento, è un non UIView un MainView. Il MainView è una visualizzazione secondaria di self.view.

in .m hai sintetizzare tempo? per esempio.

@synthesize weather; 

in modo che avrete la getter e setter creato.

[update] Dopo aver letto l'aggiornamento in viewDidLoad, è chiaro che si accede alla vista sbagliato, perché si è utilizzato semplicemente [addSubView self.view:], questo significa che non è il self.view MainView, è solo una visualizzazione secondaria . Si può solo dichiarare MainView * drawBox come globale e l'accesso [drawBox setWeather:]. Direttamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top