Как вытащить текстовое значение для UITextField внутри UITableViewCell? - PullRequest
1 голос
/ 28 февраля 2011

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

Часть, с которой у меня проблема - это доступ к количеству для каждого продукта. Каждый UITableViewCell имеет изображение для продукта и пару меток вместе с UITextField и кнопкой действия. Вот код для создания моей ячейки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UIButton *productButton = [UIButton buttonWithType:UIButtonTypeCustom];
        UIImage *productButtonImage = [[[UIImage alloc] initWithData:[NSData dataWithContentsOfFile:[[productList objectAtIndex:indexPath.row] valueForKey:@"product_small_image_filepath"] options:NSDataReadingMapped error:nil]] autorelease];
        productButton.frame = CGRectMake(9.0, 3.0, 48.0, 84.0);
        [productButton setBackgroundImage:productButtonImage forState:UIControlStateNormal];
        [productButton setTag:indexPath.row];
        [productButton addTarget:self action:@selector(loadProductDetailAtIndexPath:) forControlEvents:UIControlEventTouchDown];

        UILabel *productCodeLabel = [[[UILabel alloc] initWithFrame:CGRectMake(67.0, 0.0, 300.0, 34.0)] autorelease];
        productCodeLabel.tag = 100;
        [productCodeLabel setBackgroundColor:[UIColor clearColor]];
        [productCodeLabel setTextColor:[UIColor whiteColor]];

        UILabel *productNameLabel = [[[UILabel alloc] initWithFrame:CGRectMake(67.0, 34.0, 300.0, 23.0)] autorelease];
        productNameLabel.tag = 101;
        [productNameLabel setBackgroundColor:[UIColor clearColor]];
        [productNameLabel setTextColor:[UIColor lightGrayColor]];

        UILabel *productSizeLabel = [[[UILabel alloc] initWithFrame:CGRectMake(67.0, 57.0, 300.0, 23.0)] autorelease];
        productSizeLabel.tag = 102;
        [productSizeLabel setBackgroundColor:[UIColor clearColor]];
        [productSizeLabel setTextColor:[UIColor grayColor]];

        UILabel *typeQuantityLabel = [[[UILabel alloc] initWithFrame:CGRectMake(380.0, 35.0, 100.0, 30.0)] autorelease];
        typeQuantityLabel.tag = 103;
        [typeQuantityLabel setBackgroundColor:[UIColor clearColor]];
        [typeQuantityLabel setTextColor:[UIColor whiteColor]];

        UITextField *numberOfItemsTextField = [[[UITextField alloc] initWithFrame:CGRectMake(480.0, 35.0, 150.0, 30.0)] autorelease];
        numberOfItemsTextField.tag = 104;
        [numberOfItemsTextField setKeyboardType:UIKeyboardTypeNumberPad];
        [numberOfItemsTextField setReturnKeyType:UIReturnKeyDone];
        [numberOfItemsTextField setBackgroundColor:[UIColor clearColor]];
        [numberOfItemsTextField setBorderStyle:UITextBorderStyleRoundedRect];
        [numberOfItemsTextField setTextAlignment:UITextAlignmentRight];

        UIButton *productAddButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        productAddButton.frame = CGRectMake(650.0, 35.0, 70.0, 30.0);
        productAddButton.tag = indexPath.row;
        [productAddButton setBackgroundColor:[UIColor clearColor]];
        [productAddButton setTitle:@"ADD" forState:UIControlStateNormal];
        [productAddButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        [productAddButton addTarget:self action:@selector(addItemToOrderedItemsMutableArray:) forControlEvents:UIControlEventTouchDown];

        [cell addSubview:productButton];
        [cell addSubview:productCodeLabel];
        [cell addSubview:productNameLabel];
        [cell addSubview:productSizeLabel];
        [cell addSubview:typeQuantityLabel];
        [cell addSubview:numberOfItemsTextField];
        [cell addSubview:productAddButton];

        UIView *v = [[[UIView alloc] init] autorelease];
        v.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.5];
        [cell setSelectedBackgroundView:v];
    } 
    // Configure the cell...
    UIButton *productButton = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *productButtonImage = [[[UIImage alloc] initWithData:[NSData dataWithContentsOfFile:[[productList objectAtIndex:indexPath.row] valueForKey:@"product_small_image_filepath"] options:NSDataReadingMapped error:nil]] autorelease];
    productButton.frame = CGRectMake(9.0, 3.0, 48.0, 84.0);
    [productButton setBackgroundImage:productButtonImage forState:UIControlStateNormal];
    [productButton setTag:indexPath.row];
    [productButton addTarget:self action:@selector(loadProductDetailAtIndexPath:) forControlEvents:UIControlEventTouchDown];
    [cell addSubview:productButton];

    UILabel *productCodeLabel = (UILabel *)[cell viewWithTag:100];
    [productCodeLabel setText:[[productList objectAtIndex:indexPath.row] valueForKey:@"product_code"]];
    self.productCode = [[productList objectAtIndex:indexPath.row] valueForKey:@"product_code"];

    UILabel *productNameLabel = (UILabel *)[cell viewWithTag:101];
    [productNameLabel setText:[[productList objectAtIndex:indexPath.row] valueForKey:@"product_name"]];

    UILabel *productSizeLabel = (UILabel *)[cell viewWithTag:102];
    [productSizeLabel setText:[[productList objectAtIndex:indexPath.row] valueForKey:@"product_size"]];

    UILabel *typeQuantityLabel = (UILabel *)[cell viewWithTag:103];
    [typeQuantityLabel setText:@"QUANTITY"];

    UITextField *quantityTextField = (UITextField *)[cell viewWithTag:104];
    [quantityTextField setText:@"0"];
    productQuantityTextField = quantityTextField;

    return cell;
}

Вся информация отображается прямо на устройстве, но когда она сводится к вводу количества для отдельного продукта, количествоTextField присваивается только последней ячейке на экране. У меня вопрос: как я могу переместить этот указатель на предыдущие ячейки в UITable, чтобы иметь возможность получить значение для данного продукта?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Я вижу, что в приведенном выше методе вы присваиваете productQuantityTextField, который, вероятно, является иваром в классе, к которому относится этот метод, текстовому полю из ячейки. Как вы обнаружили, каждый раз, когда новая ячейка становится видимой на экране, указатель изменяется, и нет другого способа вернуть другие указатели. Вы можете заметить или не заметить, что productQuantityTextField не обязательно соответствует последнему текстовому полю на странице.

Лучше всего в этом случае сделать так, чтобы ваш класс реализовал UITextFieldDelegate, и назначить ваш класс в качестве делегата для каждого текстового поля количества, которое вы создаете. В textFieldDidEndEditing: вы определяете соответствующий продукт для конкретного текстового поля и сохраняете текстовое значение для этого конкретного продукта. Вы также хотели бы изменить приведенный выше код, чтобы он считывал это количество и устанавливал для него значение lengthTextField вместо «0» всегда, в противном случае вы обнаружите, что при прокрутке детали с экрана и последующем включении кажется, что она забывает количество .

1 голос
/ 28 февраля 2011

В идеале вы должны преобразовать некоторые из них в пользовательский класс UITableViewCell. В долгосрочной перспективе это будет намного легче поддерживать.

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

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