0

カスタム テーブル ビュー セルがあり、2 つの UIButton と、edit および cancel という名前の 1 つのテキスト フィールドと、1 つの textField があります。同時に編集をクリックすると、TextFeild インタラクションが有効になり、キャンセル ボタンの画像が変更されます。私にとってはうまくいきます!!

しかし、編集ボタンをクリックすると、別のセルがキャンセルされます bitton 画像IDが自動的に変更されました! セルを再利用しているので、これが起こっていることを知っています!! しかし、私は解決策を見つけることができません...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    simpleTableIdentifier = @"MenuNameCell";
    cell = (MenuNameCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (!cell) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MenuNameCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
        NSLog(@"---------new cell agin");          
    }
    else
    {
        for (UIView *view in [cell.contentView subviews])
                [view removeFromSuperview];
        NSLog(@"---------older use");
       // _checkButton = (UIButton *)[cell.contentView viewWithTag:indexPath.row];
       // _cancelButton = (UIButton *)[cell.contentView viewWithTag:indexPath.row];
    }

    // Creating Label Menu Name
    _nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 11, 82, 21)];
    _nameLabel.backgroundColor = [UIColor clearColor];
    _nameLabel.text =  [_hotel._orderedMenus objectAtIndex:indexPath.row];

    // Creating Label Menu Cost
    _amountMenu   = [[UILabel alloc] initWithFrame:CGRectMake(167, 13, 44, 21)];
    _amountMenu.backgroundColor = [UIColor clearColor];
    _amountMenu.text  = [[_hotel._menuPrices objectAtIndex:indexPath.row] stringValue];

    // Creating Text Field For Order Quantity
    _textFieldQuantity = [[UITextField alloc] initWithFrame:CGRectMake(125,14,42,21)];
    _textFieldQuantity.userInteractionEnabled = NO;
    _textFieldQuantity.text = [[_hotel._selectedQuantity objectAtIndex:indexPath.row] stringValue];

    // Creating Button For Check Order
    _checkButton  = [UIButton buttonWithType:UIButtonTypeCustom];
    [_checkButton setFrame:CGRectMake(232, 13, 25, 28)];
    [_checkButton setBackgroundImage:[UIImage imageNamed:@"edit.png"]forState:UIControlStateNormal];
    [_checkButton addTarget:self action:@selector(editQuantity:) forControlEvents:UIControlEventTouchUpInside];
    [_checkButton setTag:indexPath.row];

    // Creating Button For CANCEL Order
    _cancelButton  = [UIButton buttonWithType:UIButtonTypeCustom];
    [_cancelButton setFrame:CGRectMake(265, 13, 25, 28)];
    [_cancelButton setBackgroundImage:[UIImage imageNamed:@"cancel.png"] forState:UIControlStateNormal];
    [_cancelButton addTarget:self  action:@selector(cancelOreder:) forControlEvents:UIControlEventTouchUpInside];
    [_cancelButton setTag:indexPath.row];

    // Adding All To Call Content View
    [cell.contentView addSubview:_nameLabel];
    [cell.contentView addSubview:_amountMenu];
    [cell.contentView addSubview:_textFieldQuantity];
    [cell.contentView addSubview:_checkButton];
    [cell.contentView addSubview:_cancelButton];

    return cell;
}

編集:

-(void)editQuantity:(id)sender 
{ 
    _textFieldQuantity.userInteractionEnabled = YES; 
    button = (UIButton *)sender; 
    row = button.tag; 
    NSLog(@"Check Button index is %d",row); 
    UIImage *buttonImage = [UIImage imageNamed:@"edit_over.png"]; 
    [_checkButton setBackgroundImage:buttonImage forState:UIControlStateNormal]; 
    UIImage *buttonImageCancel = [UIImage imageNamed:@"check.png"]; 
    [_cancelButton setBackgroundImage:buttonImageCancel forState:UIControlStateNormal]; 
    _cancelButton.tag = 0; 
}

-(void)cancelOreder:(id)sender{

button = (UIButton *)sender;
row = button.tag;
NSLog(@"The Row Selected iS At Cancel Order ISSSS----%d", row);
if (_cancelButton.tag ==  0){
    _textFieldQuantity.userInteractionEnabled = NO;
    UIImage *buttonImageCancel = [UIImage imageNamed:@"check_over.png"];
    [_cancelButton setBackgroundImage:buttonImageCancel  forState:UIControlStateNormal];
    UIImage *buttonImageCancel1 = [UIImage imageNamed:@"cancel.png"];
    [_cancelButton setBackgroundImage:buttonImageCancel1 forState:UIControlStateNormal];
    UIImage *buttonImage = [UIImage imageNamed:@"edit.png"];
    [_checkButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
    _cancelButton.tag = 1;
}
else
{
    UIAlertView *alert =  [[UIAlertView alloc] initWithTitle:@"iHomeDelivery" message:@"Do You Want To Cancel the Order" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

}

4

1 に答える 1

0

あなたの問題は、_textFieldQuantity (およびその他) がインスタンス変数であることです。editQuantity: および cancelOreder: が呼び出されると、インスタンス varialbe は、 cellForRowAtIndexPath: 内にセルを追加したときに前回設定された値と同じままです。

それを修正するために何ができますか?1つ目:ボタンのタグに行を設定できます。次に、ボタンがタップされてアクションが呼び出されると、タグを取得してセルをフェッチし (テーブルの cellForRowAtIndexPath メソッドを呼び出して取得できます。これは、実装するデリゲート メソッドとは異なります)、適切な textField を見つけます。

2 番目: もう少し作業が必要ですが、テーブル セルのサブクラスを実装する方が賢明かもしれません。アクション メソッドをまさにそのセル クラスに移動します。そうすることで、各ボタンのアクションは個々のオブジェクトを参照します。これは、ビュー コントローラーではなく、セル クラスです。cell クラスは、独自の textField インスタンス変数を持つことができます。cellForRowAtIndexPath で値を設定できるように、textField やその他の UIItem にプロパティを提供する必要もあります。

クイックスターターとして最初のソリューションをお勧めします。しかし、将来の使用のために、2番目の方法を使用することを強くお勧めします. そうすれば、将来同様の状況であなたを助けることができます。

于 2012-12-21T10:47:07.167 に答える