2011-09-01 14 views
13

Ok Non so perché questo non funziona, ma ho collegato un TableView, con 19 elementi di testo che vorrei impostare su ogni cella.Il mio UITableView non scorrerà verso il basso fino alla fine dei dati! Perché?

Le celle vengono compilate correttamente, ma quando provo a scorrere, esso va laggiù e posso vedere le celle che non sono visibili nella vista iniziale, si blocca e non scorrerà verso il basso. Torna indietro. MOLTO STRANO!

Cosa sto sbagliando?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
// Return the number of sections. 
return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
// Return the number of rows in the section. 
return 19; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

// Configure the cell... 
if(indexPath.row == 0){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 1){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 2){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 3){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 4){ 
    cell.indentationLevel = 2; 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 5){ 
    cell.indentationLevel = 2; 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 6){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 7){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 8){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 9){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 10){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 11){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 12){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 13){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 14){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 15){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 16){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 17){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 18){ 
    cell.textLabel.text = @""; 
} 

return cell; 
} 
+1

Tutte le cellule sono vuote etichette di testo stringa. Sei davvero sicuro di non scorrere correttamente e non puoi dirlo perché tutte le celle si assomigliano? – picciano

risposta

38

Diminuzione del tableView altezza.

+7

Wow, è stato imbarazzante! Grazie per il tuo aiuto –

+1

Ciao, sto avendo lo stesso problema. Ho provato a ridurre la dimensione della mia vista tabella ma ancora non scorrere verso il basso e scorre solo fino alla prima cella/parte superiore della vista tabella. –

+2

Penso che una delle seguenti cose causi questo problema. 1. L'altezza del tavolo si estende oltre l'altezza del dispositivo. 2. Alcuni altri elementi dell'interfaccia utente si sovrappongono alla parte inferiore della tabella. 3. Sono state apportate modifiche ai dati della tabella dall'ultima volta che è stato caricato. – septerr

2

Il codice che hai condiviso mi sembra adatto. Stai spingendo il controller di visualizzazione con questa vista tabella sullo stack del controller di navigazione? Ho visto persone farlo prima. L'altezza predefinita della cella è 44px e l'altezza della barra di navigazione è pari a 44px. Quindi, se lo si spinge sullo stack del controller di navigazione, si scorre la vista indietro come descritto. In tal caso, riduci l'altezza di TableView di 44 px (in Interface Builder o Programatically se lo hai disegnato in modo programmatico) e dovrebbe risolverlo.

1

È necessario regolare l'altezza di UITableView oppure provare a inserire [tableView reloadData] all'interno del metodo viewDidAppear (non sembra funzionare se inserito all'interno di viewWillAppear o viewDidLoad).

Il primo funziona per me nella maggior parte dei casi.

5

so che è una vecchia questione e questo è non è una risposta alla tua domanda, ma un suggerimento per migliorare il codice in modo che altri possano trarre beneficio.

Si potrebbe scrivere questo:

if (indexPath.row >= 4 && indexPath.row <= 8) { // 4 and 8 inclusive 
    cell.indentationLevel = 2; 
} 
cell.textLabel.text = @""; 


Invece di questo:

if(indexPath.row == 0){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 1){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 2){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 3){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 4){ 
    cell.indentationLevel = 2; 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 5){ 
    cell.indentationLevel = 2; 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 6){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 7){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 8){ 
    cell.indentationLevel = 2;  
    cell.textLabel.text = @""; 
}else if(indexPath.row == 9){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 10){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 11){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 12){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 13){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 14){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 15){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 16){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 17){ 
    cell.textLabel.text = @""; 
}else if(indexPath.row == 18){ 
    cell.textLabel.text = @""; 
} 


E se vi capita di avere un testo diverso per ogni singolo caso si potrebbe o uso :

switch (indexPath.row) { 
    case 0: 
     cell.textLabel.text = @""; 
     break; 
     ... 
    case 18: 
     cell.textLabel.text = @""; 
    default: 
     break; 
} 

O anche meglio mettere tutto all'interno di un NSArray (database ...) e semplicemente passarci sopra attraverso l'indice.

4

@EmptyStack la risposta è giusta. Quello era un alternativo ma NON la soluzione.

Anche noi possiamo ottenere lo stesso nello storyboard.

Seleziona tableView -> dal controllo storyboard fai clic su "aggiungi Vincoli mancanti". Ciò aggiungerà il vincolo a tableView e View.

Questo mi ha aiutato a risolvere questo problema. Un screen_shot allegato per riferimento.solution

+0

Ricorda che "Aggiungi vincoli mancanti" può aggiungere vincoli ai margini, che non sono supportati nelle versioni precedenti di ios8. – BDR

1

Se si dispone di uno storyboard o di un pennino, provare questo (nota, potrebbe essere necessario aggiungere alcuni vincoli se si desidera supportare il panorama).

enter image description here

6

Questo mi ha aiutato:

[self.tableView setContentInset:UIEdgeInsetsMake(0,0,65,0)]; 
+3

Potresti per favore elaborare più la tua risposta aggiungendo un po 'più di descrizione della soluzione che fornisci? – abarisone

+0

Dopo aver modificato la mia vista tabella per utilizzare una cella di intestazione da uno xib, ho riscontrato il problema di scorrimento. Questo ha risolto il mio problema, ma sono scettico sui problemi che potrebbe causare downstream. Deve esserci qualcos'altro in corso ... – Jeff

Problemi correlati