Повторное использование ячейки с подпредставлением (программно) - PullRequest
1 голос
/ 14 июня 2011

У меня проблема с программным добавлением подпредставления в ячейку UITableView. Я пытаюсь добавить UITextFiled в 2 ячейки и UILabel в другую ячейку в одном разделе моей таблицы. Таблица состоит из 3 разделов, и большинство из них созданы вручную. Одна из ячеек при выборе вызывает действие, которое вставляет еще четыре ячейки. Если снова выбрать те же ячейки, четыре ячейки будут удалены. Когда это действие происходит, подпредставления перепутаны и находятся в неправильных ячейках. Клавиатура также не реагирует на готовую клавишу.

Я пытаюсь создать подпредставления внутри условного оператора if (cell == nil). Вот мой код, который создает ячейки (извините за то, что он такой грязный, я пробовал массу вещей):

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSLog(@"cell created");
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    if (indexPath.section == 0 && indexPath.row == 0 && ([cellText objectAtIndex:indexPath.row] == @"Weight")) {
        exerciseWeight = [[[UITextField alloc] initWithFrame:CGRectMake(0, 12, 295, 30)] autorelease];
        exerciseWeight.textAlignment = UITextAlignmentRight;
        exerciseWeight.adjustsFontSizeToFitWidth = YES;
        exerciseWeight.textColor = [UIColor blackColor];
        exerciseWeight.backgroundColor = [UIColor clearColor];
        exerciseWeight.tag = 89899;
        exerciseWeight.keyboardType = UIKeyboardTypeNumberPad;
        [exerciseWeight setReturnKeyType:UIReturnKeyDone];
        exerciseWeight.clearButtonMode = UITextFieldViewModeNever;
        [exerciseWeight setEnabled: YES];
        [exerciseWeight setDelegate:self];
        [cell addSubview:exerciseWeight];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.accessoryType = UITableViewCellAccessoryNone;

    } else if (indexPath.section == 0 && indexPath.row == 1) {
        NSLog(@"Created metric subview");
        metric = [[[UILabel alloc] initWithFrame:CGRectMake(100, 5, 180, 30)] autorelease];
        metric.textAlignment = UITextAlignmentRight;
        metric.textColor = [UIColor grayColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
        metric.tag = 89898;
        [cell addSubview:metric];
    } else if (([cellText count] - 1) == indexPath.row){
        exerciseReps = [[[UITextField alloc] initWithFrame:CGRectMake(0, 12, 295, 30)] autorelease];
        exerciseReps.textAlignment = UITextAlignmentRight;
        exerciseReps.adjustsFontSizeToFitWidth = YES;
        exerciseReps.backgroundColor = [UIColor clearColor];
        exerciseReps.tag = 89890;
        exerciseReps.keyboardType = UIKeyboardTypeNumberPad;
        [exerciseReps setReturnKeyType:UIReturnKeyDone];
        exerciseReps.clearButtonMode = UITextFieldViewModeNever;
        [exerciseReps setEnabled:YES];
        [exerciseReps setDelegate:self];
        [cell addSubview:exerciseReps];
    } else if (indexPath.section == 2) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
} else {
    exerciseWeight = (UITextField *)[cell viewWithTag:89899];
    metric = (UILabel *)[cell viewWithTag:89898];
    exerciseReps = (UITextField *)[cell viewWithTag:89890];
}
if (indexPath.section == 0) {
    cell.textLabel.text = [cellText objectAtIndex:indexPath.row];
}
// Configure the cell...
if (indexPath.section == 0 && indexPath.row == 0) {
    cell.textLabel.textAlignment = UITextAlignmentLeft;
    exerciseWeight.placeholder = @"160";


} else if (indexPath.section == 0 && indexPath.row == 1) {
    metric.text = metricUnit;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
} else if (cell.textLabel.text == @"Repetitions"){
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.accessoryType = UITableViewCellAccessoryNone;
    exerciseReps.placeholder = @"10";
} else if (indexPath.section == 1) {
    cell.textLabel.text = @"Log New Set";
    cell.textLabel.textAlignment = UITextAlignmentCenter;
    cell.accessoryType = UITableViewCellAccessoryNone;
} else if (indexPath.section == 2) {
    cell.textLabel.text = @"History";

} else if (cell.textLabel.text == @"  Pounds") {
    cell.textLabel.textColor = [UIColor grayColor];
    cell.textLabel.font = [UIFont systemFontOfSize:14];
} else if (cell.textLabel.text == @"  Kilograms") {
    cell.textLabel.textColor = [UIColor grayColor];
    cell.textLabel.font = [UIFont systemFontOfSize:14];
} else if (cell.textLabel.text == @"  Miles") {
    cell.textLabel.textColor = [UIColor grayColor];
    cell.textLabel.font = [UIFont systemFontOfSize:14];
} else if (cell.textLabel.text == @"  Kilometers") {
    cell.textLabel.textColor = [UIColor grayColor];
    cell.textLabel.font = [UIFont systemFontOfSize:14];
}

return cell;

// [exerciseWeight release];
// [metric release];
// [exerciseReps release]; 
}

1 Ответ

1 голос
/ 14 июня 2011

похоже, вы собираетесь повеселиться здесь.Но как только вы закончите, это удовлетворит: -)

Я не уверен, что код, который вы разместили, - это то, о чем вам нужно беспокоиться.То, что вы видите в своей таблице (прежде всего), определяют такие методы, как heightForRowAtIndexPath, numberOfSectionsInTableView и numberOfRowsInSection.Если вы сделаете это правильно, вы получите нужный вам дисплей.Поэтому, когда вы нажимаете на ячейку, вы изменяете свои базовые структуры данных, затем вызываете reloadData, в результате чего табличное представление снова вызывает эти методы.

Что касается размещения этих ячеек, я не вижу, чтобы вы вообще использовали contentView ячейки.Вы посмотрели блог «Какао с любовью», в частности Простой пользовательский рисунок UITableView и Создание UITableView, чертеж и управление (пересмотренный вариант) ?Я также использовал xib-метод определения ячеек табличного представления, как описано в документации Apple, Руководство по программированию табличного представления для iOS , и учитывая тот факт, что Xcode просто продолжает улучшать взаимодействие конструктора интерфейса с кодом, вероятно, продолжит делать это.,Я был очень против IB, но теперь вижу смысл в его использовании, поскольку Xcode 4 избавил от необходимости переключать приложения для его использования, гораздо меньше возможностей совершать ошибки.

Я думаю, чточто, когда вы «добавляете представление» в ячейку, вы должны просто переключиться на другую ячейку, которую вы определили, и загрузить ячейку после reloadData, как требуется.Когда вы хотите добавить ячейки, вы изменяете свои базовые структуры данных и позволяете таблице отображать саму себя.

По вопросу об идентификаторах ячеек - вы можете использовать один идентификатор ячейки и сэкономить только затраты на создание ячейки, факторингИз всего, что вы делаете для всех ваших ячеек, ИЛИ вы можете создать ячейки с уникальным идентификатором для каждого типа ячеек и повторно использовать вариант ячейки TK421, когда ваш раздел / строка указывает на необходимость TK421.Я склонен делать второе.На самом деле я не знаю, какой из них работает лучше, но я уверен, что любой из них лучше, чем отсутствие повторного использования.

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