更新tableview单元格

时间:2011-05-16 20:53:25

标签: iphone ios uitableview nsindexpath

我仍然像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”,则会调用一个向上滚动时间选择datePicker的动画。随着时间的推移,“时钟输入”时间更新。

这是我遇到问题的地方。随着“时钟输入”时间的更新,我无法弄清楚如何更新“Out to Lunch”行。

以下是我采摘行动的代码 -

- (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时间单元格,将新时间放在那里。
  3. 将会有两行以及outToLunch行同时更新。

    我该怎么做?

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在你的结尾 - (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],但这对于重新加载单行来说是过度的,特别是如果您拥有的行数很大。

答案 1 :(得分:0)

使用timthetoolman的有用建议和Google搜索的各种变体来处理此问题。我找到了这个stackoverflow文章:“How to select the indexPath of the UITableView after a pop?Thomas回答了我使用了以下代码:

已添加到.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]);

当使用datePicker更改clockIn时间时,这会影响更新原始空间的cell.detailLabel.text的内容。

非常感谢timthetoolmanThomas的帮助。