Applicazione si blocca dopo aver tentato di impostare typedef enum
-
27-09-2019 - |
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];
}
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.
- declare
MainView *drawBox;
in .h - in viewDidLoad, init come
drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
- 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