Un po 'di background: sto passando attraverso i video iTune CS193P e sono rimasto bloccato sul compito 3 per il tempo più lungo. Fondamentalmente, il compito ti chiede di creare una vista personalizzata a livello di codice per visualizzare una forma sullo schermo. A proposito, non sto usando alcun controller di visualizzazione.Creazione di viste in modo programmatico in IOS (come funziona)?
Impossibile visualizzare la visualizzazione finché non ho finalmente trascinato un oggetto View in Interface Builder e ho modificato il nome dell'oggetto nella mia classe di visualizzazione personalizzata. Quindi la mia domanda è quando le persone dicono di creare una vista a livello di programmazione, stanno solo dicendo di creare manualmente la classe, ma quando è necessario visualizzarla usa IB? Non posso fare a meno di sentire come ho frainteso qualcosa?
modifica: vorrei essere più chiaro. La mia vista personalizzata è stata inizializzata con un frame di 0, 0, 200, 150 e drawRect è sovrascritto per disegnare un quadrato in esso. Il mio punto di vista non ha nemmeno compare se prova ad aggiungere alla finestra principale all'interno del mio controllo:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Tuttavia, se l'uso trascinare una vista in IB e cambiare la classe alla mia classe di visualizzazione, si presenta bene.
Modifica: aggiunto un po 'di codice. Questo è il metodo awakeFromNib del mio controller in cui deve essere disegnata la vista.
- (void)awakeFromNib {
shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[self updateInterface];
}
Parte del metodo updateInterface del mio controller:
- (void)updateInterface {
[polygonView setPolygon:shape];
[polygonView setNeedsDisplay];
...
}
PolygonView.h
#import <UIKit/UIKit.h>
#import "PolygonShape.h"
@interface PolygonView : UIView {
IBOutlet PolygonShape *polygon;
}
@property (readwrite, assign) PolygonShape *polygon;
- (void)drawRect:(CGRect)rect;
@end
PolygonView.m
#import "PolygonView.h"
@implementation PolygonView
@synthesize polygon;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
nslog(@"initialized");
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];
[[UIColor grayColor] set];
UIRectFill(bounds);
CGRect square = CGRectMake(10, 10, 10, 100);
[[UIColor blackColor] set];
UIRectFill(square);
[[UIColor redColor] set];
UIRectFill(square);
NSLog(@"drawRect called");
}
@end
Il polygonView viene inizializzato ma il drawRect isn essere calle d.
Dove viene creato il KeyWindow? Se non stai caricando un file di pennino (non è chiaro dalla tua domanda se lo sei o meno), allora dovresti creare la finestra prima di aggiungere la sottoview. – jlehr
Viene creato nella classe AppDelegate. Questo significa che devo #importare la mia classe polygonView lì e crearla lì? –
È interessante notare che se inserisco l'inizializzazione e aggiungo la mia vista alla finestra nel mio metodo updateInterface, funziona solo dopo aver fatto clic su un pulsante che chiama il metodo. Sembra che il codice non sia in elaborazione in awakeFromNib. Qualche idea? –