2012-03-14 9 views
6

Sto cercando di implementare l'applicazione basata su UITableView.Per che seleziono UITableViewStyle è Group.In my TableView la loro è sezione ogni sezione con 1 riga.Perché stiamo controllando se (cell == nil) in UITableViewController?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 15; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    return 1; 
} 
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section==12) 
    { 
     return 120; 
    } 
    else 
    { 
     return 60; 
    } 

} 

voglio aggiungere un UITextView sulla sezione

Per questo ho fatto seguente codice

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

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



    } 
    if ([indexPath section] == 12) 
    { 
     if([indexPath row]==0) 
     { 
      descriptionTextField=[[UITextView alloc] initWithFrame:CGRectMake(5, 8, 290, 106)]; 
      descriptionTextField.font = [UIFont systemFontOfSize:15.0]; 
      descriptionTextField.backgroundColor=[UIColor scrollViewTexturedBackgroundColor]; 

      [descriptionTextField setDelegate:self]; 
      [descriptionTextField setTag:2]; 
      [descriptionTextField setText:@"Enter Location Description."]; 

      descriptionTextField.keyboardType=UIKeyboardTypeDefault; 
      descriptionTextField.returnKeyType=UIReturnKeyNext; 


      descriptionTextField.textColor=[UIColor blackColor]; 
      descriptionTextField.editable=YES; 
      descriptionTextField.autocapitalizationType=UITextAutocapitalizationTypeWords; 
      descriptionTextField.autocorrectionType=UITextAutocorrectionTypeDefault; 
      descriptionTextField.textAlignment=UITextAlignmentLeft; 

      UIToolbar* keboardToolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 32)]; 

      UIBarButtonItem *extra=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
      UIBarButtonItem *Done=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(keyboardDoneButtonActin:)]; 
      [Done setWidth:65.0f]; 
      [keboardToolBar setItems:[[[NSArray alloc]initWithObjects:extra,Done, nil]autorelease] ]; 
      [extra release]; 
      [Done release]; 

      [keboardToolBar setTintColor:[UIColor blackColor]]; 
      [keboardToolBar setAlpha:.70]; 
      [descriptionTextField setInputAccessoryView:keboardToolBar]; 
      [descriptionTextField setTag:101]; 
      [cell.contentView addSubview:descriptionTextField]; 
      [descriptionTextField release]; 
     } 
    } 

    return cell; 
} 

Nel initil in scena la vista tabella come questa

enter image description here

se eseguo lo scrolling di tableview su e giù, la sezione uitextView è cambiata e mostrerà più posizioni.

enter image description here

non riesco a capire è colpa mia, perché questo happend?

se am attuazione del codice in alto nel lato se (cella == nil)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 

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

    if ([indexPath section] == 12) 
    { 
     if([indexPath row]==0) 
     { 
      **/* implemention all code here*/** 

      [cell.contentView addSubview:descriptionTextField]; 
      [descriptionTextField release]; 
     } 
    } 

    return cell; 

}

UITextView non disply, penso che non è l'allocazione.

così qual è la differenza tra il codice di applicazione in se (cella == nil) { all'interno }

se (cella == nil) {} fuori lato

+0

la differenza è che quando hai scritto il codice all'interno della cella == nil funzionerà solo una volta all'avvio se scriverai il lato che creerà ogni volta quando la vista carica –

+0

perché il valore della sezione è cambiato se si scorre tableview. se scrivo codice lato? –

+0

un'altra cosa che puoi fare nel tuo codice imposta un valore di tag per textview e poi scrivi questo codice [[cell.contentView viewWithTag: 100 + indexPath.row] removeFromSuperview]; 100 + index.row è il valore di tag –

risposta

-2
NSString *CellIdentifier = [NSString stringWithFormat:@"%i",indexPath.row]; 

// Dequeue or create a cell of the appropriate type. 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

questo può essere usato al posto di

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

questo è l'esempio semplice di scrivere all'interno della cella == nill

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 
// Dequeue or create a cell of the appropriate type. 
UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier]; 
cell= nil; 
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    [[cell.contentView viewWithTag:100+indexPath.row] removeFromSuperview]; 

    UIView *selectview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.frame.size.width, 30)]; 
    [selectview setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"strip_s12A-1_h.png"]]]; 
    cell.selectedBackgroundView = selectview; 
    [selectview release]; 

    UILabel *cellTitle=[[UILabel alloc]initWithFrame:CGRectMake(40, 0, 300, 30)]; 
    //cellTitle.adjustsFontSizeToFitWidth=YES; 
    [cellTitle setBackgroundColor:[UIColor clearColor]]; 
    [cellTitle setFont:[UIFont fontWithName:@"Arial Rounded MT Bold" size:17]]; 
    [cellTitle setTextColor:[UIColor blackColor]]; 
    cellTitle.tag = 100+indexPath.row; 

     cellTitle.text= [[[cellArray objectAtIndex:indexPath.section]objectAtIndex:indexPath.row] valueForKey:@"Des2"]; 

    [cell.contentView addSubview:cellTitle]; 

    [cellTitle release]; 
} 
return cell; 
    } 

penso che sarà sufficiente solo a destra

+0

E 'possibile creare UITextView all'interno se (cell == nil) –

+1

controllare il codice sopra ora funziona anche bene –

+0

questo funziona per voi o per altri più necessari .....? –

3

L' test if (cell == nil) gestisce il caso in cui non ci sono celle riutilizzabili da rimettere in coda, nel qual caso è necessario creare una nuova cella. Quando crei la nuova cella, sei responsabile della costruzione della sua gerarchia delle viste.

+0

se non ti dispiace puoi elaborare un po 'di più .. –

+2

@MusthafaPP Le celle vengono riciclate, piuttosto che istanziarne di nuove. Il motivo: prestazioni, velocità. Molto spesso in [OOP] (https://en.wikipedia.org/wiki/Object-oriented_programming), creiamo nuove istanze (oggetti) secondo necessità. Ma l'istanziazione di un oggetto nuovo ha un sovraccarico, richiede un po 'di tempo. In rari casi, come UITableView, abbiamo bisogno delle massime prestazioni. Riciclare un oggetto esistente, resettando le sue proprietà/variabili chiave appropriate per il nuovo utilizzo, risparmia tempo sufficiente per giustificare il fastidio. Quindi, se hai una cella disponibile, riutilizzala. Altrimenti, crea una nuova istanza. –

Problemi correlati