0

私のUITableViewCellUIButtonには、セルに動的に追加されたラベルがあります。私はセルの背景画像も持っているので、このボタンをクリックすると、セルの背景を別の画像に置き換えるか、ラベルのテキストの色を灰色や青などに変更したい.

それは可能ですか?

ny のコードは次のcellForRowAtIndexPathとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        NSArray *subviews = cell.contentView.subviews;
        for (UIView *vw in subviews)
        {
            if ([vw isKindOfClass:[UILabel class]])
            {
                [vw removeFromSuperview];
            }
        }

    NSArray * temp;
    NSData * imageData;
    if (dataToDisplay!=nil) {
        temp = [dataToDisplay objectAtIndex:indexPath.row];
        imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString: [temp objectAtIndex:4]]];
    }


    playButtonImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"music_player_play_button.png"]];
    pauseButtonImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"music_player_pause_button.png"]];

   UIButton* preview = [UIButton buttonWithType:UIButtonTypeCustom];
    preview.tag = 100 + indexPath.row;
    [preview addTarget:self
               action:@selector(playPreview:)
     forControlEvents:UIControlEventTouchUpInside];
    preview.backgroundColor = [UIColor clearColor];
    preview.frame = CGRectMake(11,6, 36, 35);
        [preview setBackgroundImage:playButtonImage.image forState:UIControlStateNormal];
    [cell addSubview:preview];

    UILabel * songName = [[UILabel alloc]initWithFrame:CGRectMake(60,15, 150, 15)];
    songName.tag = 100+indexPath.row;
    songName.text = [temp objectAtIndex:5];
    songName.font = [UIFont boldSystemFontOfSize:12];
    songName.backgroundColor = [UIColor clearColor];
    [cell addSubview:songName];

   UIButton * buy = [UIButton buttonWithType:UIButtonTypeCustom];
    [buy addTarget:self
                action:@selector(buySong:)
      forControlEvents:UIControlEventTouchUpInside];
        [buy setImage:[UIImage imageNamed:@"button_buy.png"] forState:UIControlStateNormal];
    buy.tag = 200 + indexPath.row;
    [buy setTitle:@"Buy" forState:UIControlStateNormal];
    buy.titleLabel.font = [UIFont boldSystemFontOfSize:8.0];
    buy.frame = CGRectMake(255,9,41, 30);
    [cell addSubview:buy];
    songsResults.tableHeaderView = headerView;
        UIImage * cellIcon;
    if (indexPath.row==[dataToDisplay count]-1) {
        cellIcon = [UIImage imageNamed:[cellViewImages objectAtIndex:1]];
    }
    else {
        cellIcon = [UIImage imageNamed:[cellViewImages objectAtIndex:0]];
    }
        cell.backgroundView = [[UIImageView alloc]initWithImage:cellIcon];

        cell.clipsToBounds = YES;

    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}
4

2 に答える 2

2

ボタンが押されたセルの識別子としてタグを使用します。このようにして、変更する必要のあるセルを決定できます。

-(void)buySong:(id)sender {
  UIButton *buttonPressed = (UIButton*)sender;
  NSUInteger rowSelected = buttonPressed.tag - 200;
  NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowSelected inSection:0];
  CustomTableViewCell *cellSelected = (CustomTableViewCell)[self.tableView cellForRowAtIndexPath:indexPath];
  cellSelected.label.textColor = [UIColor redColor];
}

UITableViewCellで行ったように、新しい属性を追加して後でアクセスできるように、サブクラス化する必要がありますCustomTableViewCell

カスタムを作成する方法のチュートリアルは次のとおりですUITableViewCell

乾杯

于 2012-04-15T21:07:27.103 に答える
0

ボタンのクリックを受け取る独自のアクション メソッドを持つ UITableViewCell のサブクラスを作成し、ブロックを使用してそのクリックを処理し、コントローラー コードが次のようになるようにします。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    SongCell *cell = [tableView dequeueReusableCellWithIdentifier:[SongCell identifier]];
    if (cell == nil) {
        cell = [[SongCell alloc] init];        
    }
    cell.songData = [dataToDisplay objectAtIndex:indexPath.row];
    cell.onPreviewClick =
    ^
    (SongCell *cell)
    {
        cell.isPlaying = YES;
        [self playSongAtIndexPath:indexPath]; // method to start the preview
    };
    return cell
}

これをサポートするには、UITableViewCell サブクラスは次のようになります。

// SongCell.h
@interface SongCell : UITableViewCell
@property (nonatomic, strong) NSArray *songData; // NSDictionary would be better
@property (nonatomic, copy) void(^onPreviewClick)(SongCell *cell);
@property (nonatomic, assign) BOOL isPlaying;
+ (NSString *)identifier;
@end

この実装では:

// SongCell.m
#import "SongCell.h"
@interface SongData()
@property (nonatomic, strong) NSArray *_songData;
@property (nonatomic, assign) BOOL _isPlaying;
@property (nonatomic, strong) UIButton *playImage;
@property (nonatomic, strong) UIButton *pauseImage;
@property (nonatomic, strong) UIButton *previewButton;
@property (nonatomic, strong) UILabel *songNameLabel;
- (void)previewButtonPressed:(UIButton *)button;
@end

@implementation SongCell
@synthesize onPreviewClick, _songData, _isPlaying, playImage, pauseImage, previewButton, songNameLabel;

- (id)init {
    if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[SongCell identifier]])) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        self.playImage = [UIImage imageNamed:@"music_player_play_button.png"];
        self.pauseImage = [UIImage imageNamed:@"music_player_pause_button.png"];
        self.previewButton = [UIButton buttonWithType:UIButtonTypeCustom];
        previewButton.frame = CGRectMake(11,6, 36, 35);
        [previewButton addTarget:self
                          action:@selector(previewButtonPressed:)
                forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:previewButton];

        self.songNameLabel = [[UILabel alloc]initWithFrame:CGRectMake(60,15, 150, 15)];
        songNameLabel.font = [UIFont boldSystemFontOfSize:12];
        [self addSubview:songNameLabel];
    }
    return self;
}

+ (NSString *)identifier {
    return @"SongCell";
}

- (void)setSongData:(NSArray *)songData
{
    self._songData = songData;
    [self updateSubviews];
}

- (NSArray *)songData {
    return _songData;
}

- (void)setIsPlaying:(BOOL)isPlaying {
    self._isPlaying = isPlaying;
    [self updateSubviews];
}

- (BOOL)isPlaying {
    return _isPlaying;
}

- (void)previewButtonPressed:(UIButton *)button {
    if (onPreviewClick) onPreviewClick(self);
}

- (void)updateSubviews {
    if (_isPlaying) {
        [previewButton setBackgroundImage:pauseImage forState:UIControlStateNormal];
    }
    else {
        [previewButton setBackgroundImage:playImage forState:UIControlStateNormal];
    }
    songNameLabel.text = [_songData objectAtIndex:5];
}

@end

警告: 私はこれをテストしませんでした。あまり多くのエラーが発生しないことを願っています。

于 2012-04-15T22:22:50.173 に答える