2010-11-15 24 views
0

J'ai une vue UITable groupée en tant que vue de configuration personnalisée. Chaque cellule est une vue avec 3 UITextFields et d'autres UIViews.Comment puis-je définir une identité pour chaque cellule dans UITableView?

Lorsque la cellule est créée j'appelle une fonction

[cell initCell:indexPath.section withRow:indexPath.row]; 

Et puis la cellule sait quelle configuration pour afficher - ceci fonctionne très bien.

Mon problème est que lorsque la table est défilée, la cellule perd son identité, entraînant des paramètres erronés. J'ai enregistré NSString * view; NSString * row;

mais ont toujours la dernière valeur, de la dernière cellule présentée (devenu sidplayed)

Peut-être que j'ai un missunderstanding sur les paramètres globaux, ou peut-être sur la réutilisation des cellules. S'il vous plaît conseiller, Merci

Mon cellForRowAtIndexPath:

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

if(indexPath.section==0) 
{ 
    static NSString *CellIdentifierDate = @"SettingsCellPickDate"; 

    SettingsCellPickDate *cell = (SettingsCellPickDate *)[tableView dequeueReusableCellWithIdentifier:CellIdentifierDate]; 
    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifierDate owner:self options:nil]; 

     for(id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[SettingsCellPickDate class]]) 
      { 
       cell = (SettingsCellPickDate *) currentObject; 
       break; 
      } 
     } 
    } 

    [cell initCell:indexPath.section withRow:indexPath.row]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 



    cell.frame = CGRectZero; 

    return cell; 
} 


//tableView.rowHeight = 100;  
static NSString *CellIdentifierDate = @"SettingsCellValue"; 

SettingsCellValue *cell = (SettingsCellValue *)[tableView dequeueReusableCellWithIdentifier:CellIdentifierDate]; 
if (cell == nil) { 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifierDate owner:self options:nil]; 

    for(id currentObject in topLevelObjects) { 
     if ([currentObject isKindOfClass:[SettingsCellValue class]]) 
     { 
      cell = (SettingsCellValue *) currentObject; 
      break; 
     } 
    } 
} 

[cell initCell:indexPath.section withRow:indexPath.row]; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 

cell.frame = CGRectZero; 

return cell; 

} 

Par exemple, la classe SettingsCellValue ressemble à ceci (je change des textes et des trucs supprimés qui pourraient suggérer mon idée de l'application):

#import "SettingsCellValue.h" 

@implementation SettingsCellValue 
@synthesize defLabel1, defLabel2, defLabel3, defLabel4, text1, text2, text3, typeOfBar; 

//@synthesize defLabel, valueField; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { 
     // Initialization code 
    } 

    return self; 
} 

NSString *view; 
NSString *bar; 

-(void) initCell:(int)section withRow:(int)row 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSInteger viewType = [defaults integerForKey:@"ScreenType"]; 

    bar = [self getBarAsText:section]; 
    view = [self getViewTypeAsText:viewType]; 

    //Update row 1 
    defLabel1.text = @"Text1"; 
    text1.text = [defaults objectForKey:[NSString stringWithFormat:@"%@/%@/Caption", view, bar]]; 
    //Update row 2 
    defLabel2.text = @"Text2"; 
    typeOfBar.selectedSegmentIndex = [defaults integerForKey:[NSString stringWithFormat:@"%@/%@/Type", view, bar]]; 
} 

- (NSString *) getBarAsText:(int)section 
{ 
    switch (section) { 
     case 1: 
      return @"Ba1r"; 
      break; 
     case 2: 
      return @"Bar2"; 
      break; 
     case 3: 
      return @"Bar3"; 
      break; 
     default: 
      return @"Ba1r"; 
      break; 
    } 
} 

- (NSString *) getViewTypeAsText:(int)viewType 
{ 
    switch (viewType) { 
     case 1: 
      return @"viewType1"; 
      break; 
      case 2: 
       return @"viewType2"; 
       break; 
      case 3: 
       return @"viewType3"; 
       break; 
      case 4: 
       return @"viewType4"; 
       break; 
     default: 
      return @"viewType1"; 
      break; 
    } 
} 

-(IBAction) editingDidEnded:(id) sender 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if (sender == text1) { 
     [defaults setObject:text1.text forKey:[NSString stringWithFormat:@"%@/%@/Caption", view, bar]]; 
    } 


    [defaults synchronize]; 
} 

- (void)dealloc { 
    [ defLabel1, defLabel2, defLabel3, defLabel4, text1, text2, text3, typeOfBar release]; 
    [super dealloc]; 
} 


@end 
+0

Il serait utile d'utiliser tableView: cellForRowAtIndexPath: ' – vikingosegundo

+0

Vous devriez être servis en lisant sur MVC et en parcourant l'exemple de code de la suite tableview. Vous faites des choses si mauvaises que vous devez recommencer et changer votre façon de penser. C'est plus que je veux vous aider avec moi-même. S'il vous plaît, apprenez ce qu'est MVC, à quoi ça sert, et que c'est ainsi que les frameworks sont conçus et devraient être utilisés. En outre, découvrez la réutilisation des cellules, le fonctionnement des vues de table, etc. Il y a de nombreux exemples dans la suite que je référence dans ce commentaire. Bonne chance. – jer

+0

À quoi ressemble initCell: withRow? –

Répondre

0

Vous ne devez pas lier un certain objet de données à un objet-cellule donné, car cela risquerait de rompre la réutilisation de la cellule. Bien que votre code ne semble pas totalement faux, le titre de votre question pointe dans la direction que vous n'avez pas encore comprise.

Une chose que j'ai remarquée: Vous utilisez deux fois static NSString *CellIdentifierDate. vous devriez en renommer un.

+0

Tout d'abord, merci pour le top j'ai changé le nom de la variable, il ne devrait pas non plus dire "Date". Quelqu'un a déjà dit Command + C, Command + V sont votre plus grand ennemi. La réutilisation de ma cellule fonctionne très bien, mon seul problème est qu'une variable globale de la cellule est définie sur la valeur de la cellule créée en dernier. Lisez ce que j'ai écrit dans le commentaire pour les autres answear. – AYBABTU

+0

Comme je l'ai fait remarquer - le code que vous avez posté ne semble pas faux. L'erreur est ailleurs. – vikingosegundo

+0

Mon problème est avec la variable "NSString * bar" qui, pour une raison quelconque, est toujours définie sur la valeur de la dernière cellule créée/réutilisée. Il est défini à l'aide de - (void) initCell: (int) section withRow: (int) row – AYBABTU