0

メソッドのセルにボタンを追加しようとしていますcellForRowAtIndexPath。それは機能しますが、セルが更新されるたびにボタンを追加しているようです(間違った画面位置を更新したため、これを発見し、両方が機能してクリックできるボタンが2つあります)。

UIButtonセルに追加されたものを割り当てて解放する正しいタイミングはいつですか? 確かに最後にボタンを離すことはできませんcellForRowAtIndexPath- それはボタンオブジェクトを破壊しますよね? これまでにセルに追加されたボタンで見つけたすべてのスニペットは、インスタンス化された新しいUIButtonオブジェクトを保持しているようで、その中cellForRowAtIndexPathにはやや混乱しています..

4

3 に答える 3

1

通常、 を介してセルを取得しようとしdequeueReusableCellWithIdentifier、それが を返す場合はnil、 を作成しUITableViewCellます。その場合にのみ、ボタンを作成する必要があります。それ以外の場合、ボタンは既に存在します。

リリースするタイミングに関しては、通常、(a) ボタンを作成します。(b) セルのサブビューとして追加します。(c) ARC コードの場合は、そこでボタンを離します。サブビューとして追加されているため、保持カウントは 1 のままであり、セル自体が解放されるまで解放されません (心配する必要はありません... iOS が自動的に行います)。

したがって、あなたcellForRowAtIndexPathは次のようになります:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UIButton *button;
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        button = [[UIButton alloc] initWithFrame:buttonFrame];
        [button setTag:kButtonTag]; // if you need to do any reconfiguring of the button, it may be useful to set a tag
        // do additional button configuration
        [[cell contentView] addSubview:button];
        [button release]; // only needed if non-ARC
    }
    else
    {
        // if you need to reconfigure the button, you can grab it from the dequeued cell
        // obviously if you don't need to reconfigure it, you don't need to retrieve it again
        button = (UIButton*)[[cell contentView] viewWithTag:kButtonTag];
    }

    // complete the configuration of the cell

    return cell;
}
于 2012-06-30T05:34:44.757 に答える
1

いくつかのこと:

  1. 異なる種類のセルに同じセル識別子を使用しているため、ボタンが別の場所に表示されています。セルの各タイプは、独自の識別子を取得する必要があります。

  2. ボタンが消えるという点では、結果としてなぜそうなったのかはわかりませんがreloadRowsAtIndexPaths、ボタンを他のサブビューの前面に移動すると、失われません。

  3. おそらくautoreleaseUITextFieldが必要です。( の NSString と同じですtitleForHeaderInSection。)

とにかく、は次のcellForRowAtIndexPathようになります。

#define kTextFieldTag 100
#define kButtonFieldTag 101

//-----------------------------------------------------------------------------------------
// cellForRowAtIndexPath
//-----------------------------------------------------------------------------------------
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier;
    UITableViewCell *cell;

    // Configure the cell...
    switch( [indexPath section] ) 
    {
        case WORKSHEET_SECTION_CLIENT: 
            cellIdentifier = @"CellClient";

            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
            }

            cell.textLabel.text = clientName;
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;      
            break;

        case WORKSHEET_SECTION_PERIOD: 
        {
            UIButton *myButton1;

            cellIdentifier = @"CellPeriod";

            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

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

                // Don't need UIButton alloc because method below does it for us..
                myButton1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
                myButton1.tag = kButtonFieldTag;

                CGRect cellFrame = [self.tableView rectForRowAtIndexPath:indexPath];

                int nButtonWidth  = 80;
                int nButtonHeight = 30;
                int nActualCellWidth = cellFrame.size.width - 40;
                int nButtonDeltaX = ( nActualCellWidth      - nButtonWidth  ) / 2;
                int nButtonDeltaY = ( cellFrame.size.height - nButtonHeight ) / 2;
                myButton1.frame = CGRectMake( nButtonDeltaX, nButtonDeltaY, nButtonWidth, nButtonHeight );      

                [myButton1 setTitle:@"OK" forState:UIControlStateNormal];

                // PDS: Add delaget for stopwatch clicking..
                [myButton1 addTarget:self action:@selector(buttonClickedStopWatch:) forControlEvents:UIControlEventTouchUpInside];  

                [cell.contentView addSubview:myButton1];      
            }
            else
            {
                myButton1 = (UIButton *)[[cell contentView] viewWithTag:kButtonFieldTag];
            }

            cell.textLabel.text = timeElapsed;
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   
            [[cell contentView] bringSubviewToFront:myButton1];

            break;      
        }

        case 2:
            cellIdentifier = @"Cell2";

            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
            }

            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.textLabel.text = @"Amount $130";
            break;      

        case 3:
        {
            cellIdentifier = @"Cell3";

            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
            UITextField *myTextField;            

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

                myTextField = [[[UITextField alloc] initWithFrame:CGRectMake(20,10,125,25)] autorelease];
                [myTextField setTag:kTextFieldTag];
                myTextField.adjustsFontSizeToFitWidth = NO;
                myTextField.backgroundColor = [UIColor clearColor];
                myTextField.autocorrectionType = UITextAutocorrectionTypeNo;
                myTextField.autocapitalizationType = UITextAutocapitalizationTypeWords;
                myTextField.textAlignment   = UITextAlignmentLeft;
                myTextField.keyboardType    = UIKeyboardTypeDefault;
                myTextField.returnKeyType   = UIReturnKeyDone;
                myTextField.clearButtonMode = UITextFieldViewModeNever;
                //      myTextField.delegate = self;
                myTextField.font = [UIFont systemFontOfSize:14];

                [cell addSubview:myTextField];
            }
            else
            {
                myTextField = (UITextField *)[[cell contentView] viewWithTag:kTextFieldTag];
            }

            // note, theoretically, you could blow away anything that the user typed here
            [myTextField setPlaceholder:@"Type Data Here"];          

            cell.accessoryType = UITableViewCellAccessoryNone;

            cell.textLabel.font = [UIFont systemFontOfSize:14];
            cell.textLabel.numberOfLines = 0;
            break;

        }

        default:
            cellIdentifier = @"CellDummy";

            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
            }

            cell.textLabel.text = @"Dummy";
            break;

    }

    return cell;
}

個人的には、これを別々の方法に分割するかもしれませんが、それはあなた次第です。

于 2012-07-02T13:37:13.947 に答える
0

を追加した後、それを解放できるのが理想的UIButtonですUITableViewCell。その後、ボタンがセルに表示されるためです。

于 2012-06-30T05:13:43.753 に答える