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
Il serait utile d'utiliser tableView: cellForRowAtIndexPath: ' – vikingosegundo
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
À quoi ressemble initCell: withRow? –