0

私はまだObject-Cとして本当に環境に優しいので、うまくいけばこれをうまく伝えることができるので、うまくいけば私のコード例でこれを説明することができます。

私が持っているのは4行のテーブルです。各行には、ラベル(Clock in time、out to昼食時間など)と時間(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;

このコードのチャンクはうまく機能し、問題はありません。

「ClockIn」などの行が選択されると、アニメーションが呼び出され、datePickerを選択するときにスクロールが上に移動します。「クロックイン」によって時刻がスクロールされると、時刻が更新されます。

ここが私の問題です。「ClockIn」の時間が更新されると、「OuttoLunch」の行を更新する方法がわかりません。

これが私のピッキングアクションのために持っているコードです-

- (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. 新しいclockIn時間を取得し、それに5時間を追加して、これを新しいoutToLunch時間にします。a。NSLogは、この数学関数が機能したことを確認するためだけのものです。
  2. outToLunch時間セルのdetailTextLabelのインデックスを使用して、この新しい時間をそこに配置します。

同時に更新されるoutToLunch行とともにさらに2つの行があります。

これどうやってするの?

ご協力いただきありがとうございます。

4

2 に答える 2

1

-(IBAction)dateAction:(id)senderの最後に、次を使用します。

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

または、[self.tableView reloadData]を使用することもできますが、特に行数が多い場合は、単一の行をリロードするだけではやり過ぎです。

于 2011-05-17T00:02:37.137 に答える
0

timthetoolmanの役立つアドバイスとグーグルのバリエーションの多くでこれに取り組んだ後。私はこのstackoverflowの記事を見つけました:「ポップ後にUITableViewのindexPathを選択する方法は?トーマスが答えたもので、私は次のコードを使用しました:

.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]);

これは、clockIn時間がdatePickerで変更されたときに、元のスペースのcell.detailLabel.textの内容を更新する効果がありました。

timthetoolmanThomasの助けに大いに感謝します。

于 2011-05-17T23:54:24.430 に答える