Как я могу установить идентичность для каждой ячейки в UITableView? - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть сгруппированное представление 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

1 Ответ

0 голосов
/ 15 ноября 2010

Вы не должны привязывать определенный объект данных к определенному объекту ячейки, так как это нарушит повторное использование ячейки.Хотя ваш код выглядит не совсем неправильно, заголовок вашего вопроса указывает в том направлении, которое вы еще не поняли.

Одна вещь, которую я заметил: вы используете static NSString *CellIdentifierDate дважды.Вы должны переименовать один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...