0

UITableViewこの画像のようなセルに3つのラベルとボタンを追加しましたスクリーンショット

チェックボックスをクリックすると、他のラベルの「期限は0日です」を変更します。このコードで大丈夫です

[statusText setTextColor:[UIColor colorWithRed:0.0/255.0 green:51.0/255.0 blue:102.0/255.0 alpha:1.0]];
[statusText  setFont:[UIFont boldSystemFontOfSize:16.0]];
statusText.tag = 100;
[statusText setBackgroundColor:[UIColor clearColor]];
[checkBoxBtn setBackgroundImage:[UIImage imageNamed:@"check_normal.png"] forState:UIControlStateNormal];
[checkBoxBtn addTarget:self action:@selector(showAlert:) forControlEvents:UIControlEventTouchUpInside];
checkBoxBtn.tag = indexPath.row;
[cell.contentView addSubview:checkBoxBtn];

これは私のcheckBoxActionメソッドとshowAlertメソッドです

-(void) checkBoxAction: (UIButton *)sender 
{

    NSInteger i =sender.tag + 1;
    float perc = (i*100/18.0);
    //NSLog(@"%.2f",perc);
    NSString* percentageStr = [[NSString alloc] initWithFormat:@"%3.2f%%(%d out of 18)",perc, i];
    barTitle.text = percentageStr;
    barFGImage.hidden = NO;
    if (perc == 100.00) {
             [barFGImage setFrame:CGRectMake(barFGImage.frame.origin.x, barFGImage.frame.origin.y, 276.0, barFGImage.frame.size.height)];
        }
        else
            [barFGImage setFrame:CGRectMake(barFGImage.frame.origin.x, barFGImage.frame.origin.y, 280*perc/100, barFGImage.frame.size.height)];

        [sender setBackgroundImage:[UIImage imageNamed:@"check_select.png"] forState:UIControlStateNormal];

    sender.userInteractionEnabled = NO;

    NSString *currentDate = [formatter stringFromDate:[NSDate date]];
    NSString* statusStr = [[NSString alloc] initWithFormat:@"Completed on %@",currentDate];
    UILabel *tempLabel = (UILabel *)[[button superview] viewWithTag:100];
    tempLabel.textColor = [UIColor colorWithRed:243.0/255.0 green:134.0/255.0 blue:48.0/255.0 alpha:1.0];
    tempLabel.text = statusStr;

}

- (void) showAlert:(id)sender
{
    button = (UIButton *)sender;
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"Do you really want to complete this training?" delegate:self cancelButtonTitle:@"Yes, I've completed it" otherButtonTitles: @"No", nil];
    [alert show];
}

ここで、行(たとえば)3番目のチェックボックスを押してから、行3、4などの「0日以内に期限」のラベルを変更する必要があります。提案やサンプルコードをいただければ幸いです。ありがとう。

4

1 に答える 1

1

私の提案は単純な提案やコードサンプルではなく、MVC(Model View Controller)について読むことをお勧めします。

あなたのコードから私が知ることができることから、あなたのデータはあなたのビューオブジェクトに「保存」されているようです。これは一般的に非常に悪い考えです。セルが再利用されているため、これはテーブルビューではひどい考えであり、大きなテーブルをスクロールするとデータが消えてしまいます。

データを保持するモデルクラスを定義する必要があります。コントローラーオブジェクトはそれらのモデルオブジェクトにアクセスし、それらが制御するさまざまなビューにデータを表示します。

この種のパターンを実装したら、1つのセルで何かをチェックすると、モデルオブジェクトが更新されます。[tableView reloadData];次に、すべてのセルを一度に更新するための簡単な呼び出しを行うだけです。

于 2012-11-24T07:16:45.567 に答える