У меня есть сгруппированное представление UITable как представление с пользовательскими настройками.Каждая ячейка является представлением с 3 UITextFields и некоторыми другими UIViews.
Когда ячейка создается, я вызываю функцию
[cell initCell:indexPath.section withRow:indexPath.row];
И затем ячейка знает, какую конфигурацию отображать - это прекрасно работает.
Моя проблема в том, что при прокрутке таблицы ячейка теряет свою идентичность, в результате чего сохраняются неправильные настройки.Я сохранил NSString * view;NSString * row;
но оно всегда имеет последнее значение из последней представленной ячейки (стало sidplayed)
Возможно, у меня неправильное представление о глобальных параметрах или, возможно, о повторном использовании ячейки.Пожалуйста, посоветуйте, спасибо
Мой 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;
}
Например, класс SettingsCellValue выглядит следующим образом (я изменяю некоторые тексты и удаляю материал, который может предложить идею моего приложения):
#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