как очистить uiableviewcell - PullRequest
       3

как очистить uiableviewcell

0 голосов
/ 05 октября 2011

Здравствуйте, у меня есть один раздел пользовательских ячеек uitableview, которым я присваиваю значения из подпредставления, когда они выбираются пользователем.

Настраиваемая ячейка состоит из двух текстовых меток, одна из которых является заголовком.Другой - это место, где будет назначен выбранный элемент из подпредставления (в то время как ему не назначено, ему назначена строка «пустой».

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

Я попытался сделать это, и у меня все получилось, но у меня возникли проблемыкогда uitableview перестает отвечать на запросы, пока пользователь снова не прикоснется к табличному виду ... тогда он будет работать как обычно.

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

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"Clear";
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

       //Clears the correct uitableviewcell and releases the correct nsstring in the view 
        if (indexPath.section == 0) {
            if (indexPath.row == 0) {
                //reset uitableviewcell textlabel with default input "empty"
            vehicleSearchCell = [tableView cellForRowAtIndexPath:indexPath];
            UILabel *label2;
            label2 = (UILabel *)[vehicleSearchCell viewWithTag:2];
            label2.text = @"empty";
            [tableView reloadData]; //may or may not need to call this now
            }
            else if (indexPath.row == 1) {
                //reset uitableviewcell textlabel with default input "empty"
            }
            else if (indexPath.row == 2) {
                //reset uitableviewcell textlabel with default input "empty"
            }
            else (indexPath.row == 3) {
                //reset uitableviewcell textlabel with default input "empty"

            }

        } 
    }
}

Будущее обновление.у меня есть другая пользовательская ячейка, которую я использую для кнопки (в пользовательской ячейке есть кнопка), и пользователь также может провести по ней (что, однако, мне не нужно), кнопка очистки также отображается на этом, но после того, как кнопка очистки былаиспользуется (что, очевидно, ничего не дает), вы можете нажать другую ячейку в первый раз, задержки нет .. но если вы сделаете это с любой из ячеек в разделе 0, то вы получите неотзывчивость .. enter image description here

Обновление. Я начинаю думать, что я загружаю свои ячейки, используя теги и т. Д., Ребята, вы думаете, это может быть причиной проблемы?если так, как я могу решить это ..

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"VehicleSearchCell" owner:self options:nil];
        cell = vehicleSearchCell;
        self.vehicleSearchCell = nil;
    }
    // Configure the cell...
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if(indexPath.section == 0)
    {
        if(indexPath.row == 0)
        {
            UILabel *label1;
            label1 = (UILabel *)[cell viewWithTag:1];
            label1.text = @"Manufacture";

            UILabel *label2;
            label2 = (UILabel *)[cell viewWithTag:2];
            label2.text = manufactureSearchObjectString;
        }
        else if(indexPath.row == 1)
        {
            [[NSBundle mainBundle] loadNibNamed:@"VehicleSearchCellDual" owner:self options:nil];
            cell = vehicleSearchCellDual;
            self.vehicleSearchCellDual = nil;

            UILabel *label;
            label = (UILabel *)[cell viewWithTag:1];
            label.text = @"Model";

            UILabel *label2;
            label2 = (UILabel *)[cell viewWithTag:2];
            label2.text = @"empty";

            UILabel *label3;
            label3 = (UILabel *)[cell viewWithTag:3];
            label3.text = @"empty";
        }
        else if(indexPath.row == 2)
        {
            UILabel *label;
            label = (UILabel *)[cell viewWithTag:1];
            label.text = @"Year";

            UILabel *label2;
            label2 = (UILabel *)[cell viewWithTag:2];
            label2.text = @"empty";
        }
        else if(indexPath.row == 3)
        {
            UILabel *label;
            label = (UILabel *)[cell viewWithTag:1];
            label.text = @"Key type";

            UILabel *label2;
            label2 = (UILabel *)[cell viewWithTag:2];
            label2.text = keyTypeSearchObjectString;
        }
    }
    else if(indexPath.section == 1)
    {
        if(indexPath.row == 0)
        {
            [[NSBundle mainBundle] loadNibNamed:@"VehicleSearchButtonCell" owner:self options:nil];
            cell = searchButtonCell;
            self.searchButtonCell = nil;
        }
    }
    return cell;
}

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Я немного смущен и обеспокоен чем-то в вашем коде

    manufactureSearchObjectString = @"empty"; //Is manufactureSearchObjectString a member variable?
    [self.tableView reloadData]; //reloads the tabels so you can see the value.
    [manufactureSearchObjectString release]; //Why do you release this here?? This will leak/throw a wobbly more than likely.

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

 [manufactureSearchObjectString release];
 manufactureSearchObjectString = [[NSString alloc] initWithString:@"empty"];
 [self.tableView reloadData]; //reloads the tabels so you can see the value.

Если вы ранее не размещали его где-либо еще, то выпуск вообще не нужен.

Также вы можете захотеть использовать оператор switch или даже использовать "else if's" вместо простых операторов if как

    if (indexPath.row == 0) //if row is 0 test is correct
    {
    }
    if (indexPath.row == 1) //if row is 0 and passed the first test this still gets tested here
    {
    }
    if (indexPath.row == 2) //same again row gets tested again when it's already passed the == 0 test 

Измените это на

if (indexPath.row == 0) //if row is 0 test is correct
{
}
else if (indexPath.row == 1) //if row is 0 it's not so will not get tested again
{
}
else if (indexPath.row == 2)
{}
else //remember to finish with a plain else

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

Однако, если вы хотите иметь более общий подход к этому, вы можете вызвать cellForRowAtIndexPath: и получить прямой доступ к строке там.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
       CustomUITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
       [cell setSecondCustomTextField:@"empty"]; //or could be cell.secondCustomTextField = @empty";
       [tableView reloadData]; //may or may not need to call this now
    }
}

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

EDIT:

Хорошо, вы звоните

[[NSBundle mainBundle] loadNibNamed:@"VehicleSearchCellDual" owner:self options:nil];

но не ссылаясь ни на что, вам не нужно этого делать. Я так понимаю, вы пытаетесь загрузить свой пользовательский UITableViewCell из его NIB, но вы поступаете неправильно. Я предлагаю вам прочитать этот пост Coco with Love относительно ячеек представления пользовательских таблиц.
Я чувствую, что для добавления двух текстовых полей в UITableViewCell пользовательский NIB немного излишним, однако, поскольку вы решили сделать это таким образом, я отвечу на ваш вопрос таким образом. Для начала, нет особого смысла иметь три пользовательских ячейки, когда каждая из них так похожа. Вы можете просто создать один пользовательский файл пера UITableViewCell (это также облегчит чтение вашего кода), поэтому мы будем использовать ваш файл пера для «VehicleSearchCellDual», так как он имеет большинство функций, которые нам нужны, игнорируя другие два «VehicleSearchCell» и «VehicleSearchButtonCell», так как они вам не понадобятся. Теперь скопируйте UIButton из «VehicleSearchButtonCell» и вставьте его в «VehicleSearchCellDual» и установите для него значение «скрытый» в конструкторе интерфейса, давайте также дадим ему значение тега 4. Если вы установили теги в конструкторе интерфейса для соответствия значения, которые вы вызываете ниже, затем вызываете viewWithTag: должны возвращать то, что вы ищете, теперь, когда мы будем использовать ваш «VehicleSearchCellDual», я буду предполагать, что тег 1 соответствует крайнему левому текстовому полю, тег 2 является центральным текстовым полем, а тег 3 является самым правым текстовым полем. Хорошо, теперь вы сделали, что можете загружать ячейки таблицы следующим образом.

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
{
   NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"VehicleSearchCellDual" owner:self options:nil];
   for( NSObject* nibItem in nib )
   {
        if( [nibItem isKindOfClass:[UITableViewCell class]] )
        {
            cell = (UITableViewCell*)nibItem;
            break;
        }
    }
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if(indexPath.section == 0)
{
    UILabel* titleLabel;
    titleLabel = (UILabel *)[cell viewWithTag:1];

    UILabel* rightMostLabel;
    rightMostLabel = (UILabel *)[cell viewWithTag:3];

    if(indexPath.row == 0)
    {
        [titleLabel setText:@"Manufacture"];
        [rightMostLabel setText:manufactureSearchObjectString];
    }
    else if(indexPath.row == 1)
    {
        [titleLabel setText:@"Model"];
        [rightMostLabel setText:@"empty"];
        UILabel* leftMostLabel;
        leftMostLabel = (UILabel *)[cell viewWithTag:2];
        leftMostLabel.text = @"empty"; 
    }
    else if(indexPath.row == 2)
    {
        [titleLabel setText:@"Year"];
        [rightMostLabel setText:@"empty"];
    }
    else if(indexPath.row == 3)
    {
        [titleLabel setText:@"Key type"];
        [rightMostLabel setText:keyTypeSearchObjectString];
    }
}
else if(indexPath.section == 1)
{
    if(indexPath.row == 0)
    {
        [[cell viewWithTag:1] setHidden:YES];
        [[cell viewWithTag:2] setHidden:YES];
        [[cell viewWithTag:3] setHidden:YES];
        [[cell viewWithTag:4] setHidden:NO];
    }
}
return cell;

Теперь выше, где вы устанавливаете rightMostLabel и leftMostLabel в значение @ "empty", вы можете захотеть установить для них любую переменную-член 'searchString', подходящую для этого поля. В противном случае каждый раз, когда таблица перезагружается, значения этих полей устанавливаются как «пустые». Это должно поставить вас на правильный путь.

0 голосов
/ 06 октября 2011

Итак, я решил проблему! ... Я в основном удалил представления .hmxib начал снова, почти скопировал мой код прямо в файл, и он отлично работает ... Я понятия не имею, почему это произошло, может быть, я сделал, когда я впервые его настроил .. Я не уверен ...

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