кнопка "Избранное" в ячейках таблицы - PullRequest
0 голосов
/ 28 сентября 2011

Я реализовал следующий метод в моем tableviewcontroller для отображения избранного с пустой звездой и заполненной звездой:

-(IBAction) tapped:(UIButton *)sender
{
    if([sender isSelected])
    {
        //...
        [sender setImage:[UIImage imageNamed:@"fav-empty.png"] forState:UIControlStateNormal];
        [sender setSelected:NO];
    }
    else 
    {
        //... 
        [sender setImage:[UIImage imageNamed:@"fav-filled.png"] forState:UIControlStateNormal];
        [sender setSelected:YES];
        NSLog(@"%@",sender);
    }

}

, и я попытался использовать в этой части:

- (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] autorelease];

        UILabel *recept_neve=[[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];
        [recept_neve setTag:1];
        UIButton *kedvenc_btn=[UIButton buttonWithType:UIButtonTypeCustom];
        [kedvenc_btn setImage:[UIImage imageNamed:@"fav-empty.png"] forState:UIControlStateNormal];//default appereance on the startup
        kedvenc_btn.frame=CGRectMake(200, 20, 50, 50);
        [kedvenc_btn setTag:2];
        [kedvenc_btn addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:recept_neve];
        [[cell contentView] addSubview:kedvenc_btn];

        //[(UILabel*) [[cell contentView] viewWithTag:1] setText:[receptek objectAtIndex:indexPath.section*blokk+1]];
        //[(UIButton *) [cell contentView] viewWithTag:2];



    }
    // Configure the cell...
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    [(UILabel*) [[cell contentView] viewWithTag:1] setText:[receptek objectAtIndex:indexPath.section*blokk+1]];

    return cell;

}

Моя проблемазаключается в том, что каждая пятая кнопка в ячейках работает так же, как и раньше.Если я нажму на кнопку (пустая звезда) в первой ячейке, результат будет следующим: первая кнопка становится заполненной звездой, пока все хорошо (ожидаемое поведение), но в то же время шестая звезда становится заполненнойтоже.Или, если я нажму на вторую, седьмая звезда заполняется, и наоборот ...

Я зарегистрировал кнопки, где я нажимал, и понял, что адреса памяти равны в случае кнопок вышеупоминается.Извините за мой английский, и большое спасибо за каждую помощь заранее!

1 Ответ

1 голос
/ 28 сентября 2011

проблема была в том, что вы постоянно использовали кнопки.

Я показываю вам пример рабочего кода, чтобы правильно структурировать UITableViewCell ... Давайте сделаем это шаг за шагом.

Создайте новый класс с именем MyObjTableViewCellForSelection и предоставьте эти методы. Адаптируйте его под свои нужды!

@class MyObj;

@interface MyObjTableViewCellForSelection : UITableViewCell
{
    MyObj *myObj;
    UIImageView *imageView;
    UILabel *titleLabel;

}

@property (nonatomic,strong) MyObj *myObj;
@property (nonatomic,strong) UIImageView *imageView;
@property (nonatomic,strong) UILabel *titleLabel;

@end

Тогда реализация:

    @implementation MyObjTableViewCellForSelection
    @synthesize myObj;
    @synthesize imageView;
    @synthesize titleLabel;


    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {

            imageView = [[UIImageView alloc] initWithFrame: CGRectZero];
            imageView.contentMode = UIViewContentModeScaleAspectFit;
            [self.contentView addSubview: imageView];

            titleLabel = [[UILabel alloc] initWithFrame: CGRectZero];
            [titleLabel setFont:[UIFont systemFontOfSize:14.0]];
            [titleLabel setTextColor:[UIColor blackColor]];
            [titleLabel setHighlightedTextColor:[UIColor darkGrayColor]];
            [titleLabel setLineBreakMode: UILineBreakModeWordWrap];
            titleLabel.numberOfLines = 2;

            [self.contentView addSubview: titleLabel];

        }
        return self;
    }

    -(void) layoutSubviews {
        [super layoutSubviews];
        [imageView setFrame:CGRectMake(8.0, 10.0, 20.0, 20.0)];
        [titleLabel setFrame:CGRectMake(40.0, 1.0, 250.0, 40.0)]; //two lines

    }

    - (void)setMyObj:(MyObj *)myObjX {
        if (myObjX != myObj) {
            [myObj release];
            [myObjX retain];
            //myObj = myObjX; //only with ARC on
        }

       titleLabel.text = whatever you need accessing myObj
    }

    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
      //  selection has to be adapted to your structure
        [super setSelected:selected animated:animated];
        switch (myObj.selectedFlag) {
            case MYOBJ_STATUS_UNSELECTED:
                imageView.image =  [UIImage imageNamed:@"EmptyBullet.png"];
                 break;
            case MYOBJ_STATUS_SELECTED:
                imageView.image =  [UIImage imageNamed:@"GreyBullet.png"];
                break;


            default:
                break;
        }

@end

теперь в вашем классе просмотра вы, наконец, можете:

- (MyObj *)myObjForIndexPath:(NSIndexPath *)indexPath {
     MyObj* tmpObj = get the corresponding object
     return tmpObj;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyObjTableViewCellForSelection *cell = (MyObjTableViewCellForSelection *)[tableView dequeueReusableCellWithIdentifier:@"cellID"];
    if (cell ==  Nil) {
        cell = [[ECUTableViewCellForSelection alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellID"];
    }
    cell.myObj = [self myObjForIndexPath:indexPath]; //the assignment calls setMyObj of CLASS ECUTableViewCellForSelection that you just declared

    return cell;
}

Итак, наконец, это чистый способ сделать это ...

...