2011-10-05 11 views
6

Sto riscontrando un sacco di problemi nell'aggiunta dinamica di subviews a un UIScrollView. La vista di scorrimento funziona bene con il contenuto creato in un NIB, ma poiché le sottoview da visualizzare dipendono dai dati nella mia applicazione (una combinazione di immagini, etichette, pulsanti di opzione, ecc.) Devo essere in grado di crearli e visualizzarli dinamicamente.Non è stato visualizzato il sottoview aggiunto in modo dinamico in un UIScrollView

In base a tutto ciò che ho letto, sembra piuttosto semplice su vari siti e nella documentazione di Apple. Nel viewDidLoad del controller della vista, ho aggiunto il seguente codice,

UILabel *testLabel = [[UILabel alloc] init]; 
[testLabel setFrame:CGRectMake(50, 50, 100, 40)]; 
[testLabel setText:@"My Test label"]; 
[scrollView addSubview:testLabel]; 

[testLabel release]; 

L'etichetta non apparirà nella visualizzazione di scorrimento a tutti, ma se aggiungo il testLabel a self.view, allora sembra (ma non in il contenuto a scorrimento ovviamente). Ho anche provato ad aggiungere il codice per viewDidAppear nel caso in cui avessi frainteso l'ordine degli eventi senza fortuna.

Quando ho controllato il debugger, ho notato che l'indirizzo della vista di scorrimento è 0x0 che presumo significhi il suo null per qualche motivo che spiegherebbe perché non funziona. Ero convinto che se collegassi questo puntatore a scrollView alla visualizzazione a scorrimento reale in IB, sarebbe stato automaticamente assegnato l'indirizzo corretto. È sbagliato? Se questo è il caso, come faccio a ottenere l'indirizzo della vista?

- UPDATE -
Grazie per tutto il feedback. Ho controllato tutto come tutti hanno suggerito ed era certamente tutto corretto. Non avevo bisogno di impostare la dimensione del contenuto perché avevo alcune altre etichette fittizie (per verificare che lo scorrimento funzionasse) nella NIB. Ma ricorderò che più tardi :-)

È interessante notare che, dopo aver controllato di nuovo il codice e non aver apportato alcuna modifica, l'ho eseguito di nuovo e ha funzionato! Non so perché, ma io vi posterò la ragione se mai capirlo ...

+0

Stai chiamando [super viewDidLoad] per primo? – Colin

+0

Potresti inserire più codice?In particolare, mi interessa a) come hai inizializzato l'istanza di UIScrollView e b) il punto nel ViewController principale in cui hai collegato scrollView a self.view. Grazie! –

+0

@AsimIhsan Non ho creato dinamicamente la vista di scorrimento stessa, solo le sottoview. Ho creato la vista di scorrimento all'interno di un UIViewController usando Interface Builder e l'ho installata lì poiché non sono stato in grado di farlo funzionare in un altro modo. – richard

risposta

3

Quando si utilizza ScrollView è necessario impostare le dimensioni dei contenuti facendo:

scrollView.contentSize = CGSizeMake(@width,@height); 

In questo caso la dimensione dovrebbe essere più grande del 50,50 se volete vedere l'etichetta

Speranza ha aiutato

2

Come descritto nella sua domanda si sta lavorando con uno ScrollView cui è stato aggiunto nel XIB.

Quando si dichiara una presa come IBOultlet UIScrollView * scrlvDynamicContent;

e connetti lo stesso al tuo scrollview in interface builder, idealmente otterrai la scrollview assegnata dopo che è stato chiamato il metodo viewdidLoad.

così facendo qualcosa di

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    [self createDynamicView]; 
} 

in cui è possibile generare la visione dinamica come segue

-(void)createDynamicView{ 

    CGFloat yOffset = 0; 

    for (int i=0;i<5;i++) { 
     yOffset += 5; 
     UILabel* lblHeaderTitle = [[UILabel alloc] initWithFrame:CGRectMake(8, yOffset, 310, 21)]; 
     [lblHeaderTitle setTextAlignment:UITextAlignmentLeft]; 
     [lblHeaderTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0f]]; 
     [lblHeaderTitle setText:[currentDict valueForKey:@"TITLE"]]; 
     [lblHeaderTitle setTextColor:[UIColor blackColor]]; 


     [scrlvDynamicContent addSubview:lblHeaderTitle]; 
     [lblHeaderTitle release]; 
     //INCREMNET in yOffset 
     yOffset += 25; 

    [scrlvDynamicContent setContentSize:CGSizeMake(320, yOffset)]; 

} 

Basta fare in modo che scrlvDynamicContent sia correttamente collegato alla sua presa di impostare al suo proprietario del file

0
[scrollView setFrame:CGRectMake(0,0,320,460)]; 
[scrollView setContentSize:CGSizeMake(100, 40)]; 
[self.view addSubview:scrollView]; 


UILabel *testLabel = [[UILabel alloc] init]; 
[testLabel setFrame:CGRectMake(50, 50, 100, 40)]; 
[testLabel setText:@"My Test label"]; 


[scrollView addSubview:testLabel]; 

[testLabel release]; 
Problemi correlati