0

以下のコードに示すように、uitable でカスタム ボタンを作成し、ボタンにタグ番号を付けています。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    //NSLog(@"Inside cellForRowAtIndexPath");

    static NSString *CellIdentifier = @"Cell";

    // Try to retrieve from the table view a now-unused cell with the given identifier.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // If no cell is available, create a new one using the given identifier.
    if (cell == nil)
    {
        // Use the default cell style.
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

        button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button addTarget:self
                   action:@selector(selectPicOnBtnTouch:)
         forControlEvents:UIControlEventTouchDown];
        [button setTitle:@"btn1" forState:UIControlStateNormal];
        button.frame = CGRectMake(6.0f, 0.0f, 97.0f, 110.0f);
        button.tag = (indexPath.row)+100;
        [cell addSubview:button];

        [button setImage:[UIImage imageNamed:@"sample_pic.png"] forState:UIControlStateNormal];

    }
    else
    {
        //NSLog(@"went here 2");
        button = (UIButton *) [cell viewWithTag:((indexPath.row)+100)];
    }

    //Get an arrow next to the name
    cell.accessoryType = UITableViewCellAccessoryNone;

    return cell;

}

- (IBAction) selectPicOnBtnTouch:(id)sender
{
    button = (UIButton *)sender;
    NSLog(@"[button tag]: %d ...", [button tag]); 
}

10行のテーブルがあり、行1〜5のボタンをタッチすると、ログに次のように表示されます

[button tag]: 100 ...
[button tag]: 101 ...
[button tag]: 102 ...
[button tag]: 103 ...
[button tag]: 104 ...

これで問題ありません。問題は、行 6 ~ 10 に触れると、105 ~ 109 個のタグが期待されるが、同じタグ番号が最初から返されることです。

[button tag]: 100 ...
[button tag]: 101 ...
[button tag]: 102 ...
[button tag]: 103 ...
[button tag]: 104 ...

タグ番号を一意に保ちたい (繰り返さない) 理由は、どのボタンがどの行に対応しているかを知るためです。どうやってやるの?

4

3 に答える 3

0

セルを作成する if ブロック内にボタン タグを設定しないでください。これは、セルが再利用され、セルが再利用されるシナリオでタグを更新していないためです。

EDIT : 最初の 5 つのセルに対して、ifブロックが実行され、新しいセルが作成されています。6 番目以降のセルは再利用されるため、カウントは増加しません。

あなたの電話

button.tag = (indexPath.row)+100;

次のように、あなたのif (cell == nil)ブロックの下に:

    if (cell == nil)
    {
        //...

    }
    else
    {
      ///...
        button = (UIButton*)[[cell subviews] lastObject]; //this assumes your button is the last view in the subview array (double check)
    }
    button.tag = (indexPath.row)+100;
于 2013-06-20T14:38:10.570 に答える