1

この投稿で提案を実装しようとしています: Pass an argument to selector to pass an @selectorargument to a UIButtonin a UITableViewCellusing objc_setAssociatedObjectand objc_getAssociatedObject. 私がコーディングした方法では、作成/ロードされた最後のセルが何であれ、常に行を渡すことになります。これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *mainLabel;
    soundButton=[UIButton buttonWithType:UIButtonTypeCustom];

    if (cell == nil){

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    soundButton.tag = 33;
        [soundButton addTarget:self action:@selector(soundButtonAction) forControlEvents:UIControlEventTouchUpInside];
        [soundButton setFrame:CGRectMake(210,3,68, 37)];

         [soundButton setBackgroundImage:[UIImage imageNamed:@"musicNote"] forState:UIControlStateNormal];

         [cell.contentView addSubview:soundButton];
    } else {

        soundButton = (UIButton *)[cell.contentView viewWithTag:33];
    }
    objc_setAssociatedObject(soundButton, "IndexPath", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    return cell;
}

-(void)soundButtonAction
{
    NSIndexPath *ip = objc_getAssociatedObject(soundButton, "IndexPath");
4

1 に答える 1

1

soundButtonあなたのクラスにivarはいますか?セルがリクエストされるたびにオーバーライドされるため、最後のセルのみを取得します。

"IndexPath"また、キーとして使用するのは得策ではないと思います。

static char indexPathKey; // use address of indexPathKey as key

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *mainLabel;
    soundButton=[UIButton buttonWithType:UIButtonTypeCustom];

    if (cell == nil){

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    soundButton.tag = 33;
        [soundButton addTarget:self action:@selector(soundButtonAction:) /*extra :*/ forControlEvents:UIControlEventTouchUpInside];
        [soundButton setFrame:CGRectMake(210,3,68, 37)];

         [soundButton setBackgroundImage:[UIImage imageNamed:@"musicNote"] forState:UIControlStateNormal];

         [cell.contentView addSubview:soundButton];
    } else {

        soundButton = (UIButton *)[cell.contentView viewWithTag:33];
    }
    objc_setAssociatedObject(soundButton, &indexPathKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    return cell;
}

-(void)soundButtonAction:(UIButton *)sender
{
    NSIndexPath *ip = objc_getAssociatedObject(sender, &indexPathKey);
于 2013-02-17T09:09:56.573 に答える