Обновление ячеек таблицы - PullRequest
0 голосов
/ 17 мая 2011

Я все еще очень зеленый, как Object-C, так что, надеюсь, я смогу хорошо об этом сообщить, так что, надеюсь, с помощью примеров кода я смогу это объяснить.

У меня есть таблица с четырьмя рядами. В каждой строке есть метка (время в часах, время обеда и т. Д.) И время (detailTextLabel). Метки хранятся в массиве, а детали генерируются из семейства функций NSDate (пожалуйста, прости мою терминологию). Чтобы изменить значения времени, я использую сборщик данных, настроенный на выбор времени. Действие используется для обновления детализации строки при изменении времени с помощью средства выбора.

Следующие фрагменты кода находятся в том же классе * .m.

Вот урезанная версия этого -

// textLabel goes on the left, detailTextLabel goes on the right
// This puts the labelArray on the left and times on the right
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *kCustomCellID = @"CustomCellID";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCellID];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kCustomCellID] autorelease];

        // This disable the hightlighter effect when we select a row.
        // We need the highlighter, but we'll leave the code here.
        // cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    cell.textLabel.text = [self.labelArray objectAtIndex:indexPath.row];


    // --- Start of routine to work with adding hours and minutes to stuff

    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];

    // --- Set Clock In time (initially time 'now').  
    if (indexPath.row == [labelArray indexOfObjectIdenticalTo:@"Clock In"])
    {
        self.clockIn = [NSDate date];

        cell.detailTextLabel.text = [self.dateFormatter stringFromDate:clockIn];

        NSLog(@"Clock In - %@", clockIn);
        //NSLog(@"Clock In (cell*) - %@", cell.detailTextLabel.text);

        return cell;
    }    

    // --- Set Out to Lunch time (initially clockIn + 5 hours)
    if (indexPath.row == [labelArray indexOfObjectIdenticalTo:@"Out to Lunch"])
    {
        [offsetComponents setHour:5];

        self.outToLunch = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
                              dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];

        cell.detailTextLabel.text = [self.dateFormatter stringFromDate:outToLunch];

        NSLog(@"indexPath.row (Out to Lunch): %i", indexPath.row);

        NSLog(@"Out to Lunch - %@", outToLunch);
        //NSLog(@"Out to Lunch (cell*) - %@", cell.detailTextLabel.text);

        return cell;
    }

    // Leaving out two other if clauses as they duplicate the Out to Lunch clause.

    //cell.detailTextLabel.text = [self.dateFormatter stringFromDate:[NSDate date]];
    //return cell;
    return nil;

Этот кусок кода работает хорошо и не доставляет мне проблем.

Когда выбрана строка, такая как «Clock In», вызывается анимация, которая прокручивает вверх указатель даты выбора времени. Поскольку время прокручивается обновлением времени "Clock In".

Вот где у меня проблема. Я не могу понять, как получить обновление строки "Out to Lunch" при обновлении времени "Clock In".

Вот код, который у меня есть для моего действия по подбору -

- (IBAction)dateAction:(id)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.detailTextLabel.text = [self.dateFormatter stringFromDate:self.pickerView.date];

    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];

    if (indexPath.row == [labelArray indexOfObjectIdenticalTo:@"Clock In"])
    {
        if (cell.detailTextLabel.text != [self.dateFormatter stringFromDate:clockIn])
        {
            NSLog(@"clockIn time changed...");

            // Since clockIn time changed, we need to change outToLunch, inFromLunch, and clockOut

            // Change the outToLunch time
            [offsetComponents setHour:5];

            self.outToLunch = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
                               dateByAddingComponents:offsetComponents toDate:self.pickerView.date options:0];

            NSLog(@"New Out to Lunch time: %@", [self.dateFormatter stringFromDate:outToLunch]);

            // Here is where I get stuck
        }
        //return nil;
    }
}

То, что я предполагаю для предложения "Изменить время outToLunch", выглядит примерно так ...

  1. Возьмите новое время в часах и добавьте к нему 5 часов, и сделайте это новым временем outToLunch. а. NSLog просто чтобы увидеть, что эта математическая функция работает.
  2. Используя индекс detailTextLabel для ячейки времени outToLunch, поместите это новое время туда.

Там будет еще две строки вместе со строкой outToLunch, которые будут обновлены одновременно.

Как я могу это сделать?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

в конце вашего - (IBAction) dateAction: (id) отправитель использует следующее:

    // Here is where I get stuck
      }
      //return nil;
  }
  NSArray *indexPathArray=[NSArray arrayWithObject:indexPath];
  [self.tableView reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationNone];
}

в качестве альтернативы, вы можете использовать [self.tableView reloadData], но это перебор для простой перезагрузкиодна строка, особенно если количество строк у вас большое.

0 голосов
/ 18 мая 2011

После работы над этим с помощью timthetoolman полезных советов и множества вариантов поиска в Google. Я нашел эту статью: « Как выбрать indexPath UITableView после всплывающего окна? », на который Томас ответил, что я использовал следующие фрагменты кода:

Добавлено в .h файл

    NSIndexPath* outToLunchIndexPath;

        //...
    }

    //...

    @property (nonatomic, retain) NSIndexPath* outToLunchIndexPath;

    //...

    @end

Добавлено в .m файл

@synthesize outToLunchIndexPath;

Затем в моем коде я добавил эти строки

self.outToLunch = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
                           dateByAddingComponents:offsetComponents toDate:self.pickerView.date options:0];
        // New code...
        UITableViewCell *outToLunchCell = [self.tableView cellForRowAtIndexPath:outToLunchIndex];
        outToLunchCell.detailTextLabel.text = [self.dateFormatter stringFromDate:outToLunch];

        NSLog(@"New Out to Lunch time: %@", [self.dateFormatter stringFromDate:outToLunch]);

Это оказало влияние на обновление содержимого cell.detailLabel.text исходного пространства, поскольку время clockIn изменилось с помощью DatePicker.

Большое спасибо timthetoolman и Томасу за помощь.

...