IOS: сохранение состояния кнопки в uitableviewcell - PullRequest
3 голосов
/ 24 февраля 2012

У меня проблема с приложением для iPhone, которая беспокоила меня в течение нескольких дней, и не похоже, чтобы это было так сложно, поэтому я уверен, что упускаю что-то очевидное.Я исследовал множество дискуссий на форумах по «схожим» темам, но ничего, что действительно решает эту проблему, в частности.

Чтобы было ясно, если есть какая-то часть документации или другой источник, который я должен исследовать, пожалуйста, укажитеменя в правильном направлении.

Здесь идет ...

У меня есть список элементов, которые я показываю пользователю в таблице (uitableview).Ячейка (uitableviewcell) для каждого элемента является пользовательской и содержит изображение и кнопку «Мне нравится» (uibutton).Как и ожидалось, для каждого элемента в таблице пользователь может нажать кнопку «Нравится» или проигнорировать ее.Кнопка «Мне нравится» вызывает отдельный процесс обновления сервера.Просто, верно?

Итак, вот в чем проблема:

При нажатии кнопки «Мне нравится» в конкретной ячейке состояние «Выбрано» работает нормально, но в тот момент, когда вы прокручиваете ячейку вне поля зрения,другие случайные ячейки в таблице показывают кнопку «Нравится» как выбранную, даже если они никогда не были затронуты.Поскольку ячейки используются повторно по понятным причинам производительности, я понимаю, почему это может произойти.Я не понимаю, почему мой подход (см. Код ниже) не отменяет и не сбрасывает состояние кнопки так, как я думаю.Для краткости, я включаю только соответствующий код (надеюсь, правильно отформатированный):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyCustomCell";
    MyCustomViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[MyCustomViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

    NSString *myRating = [[self.dataArray objectAtIndex:indexPath.row] valueForKey:@"my_rating"];

    // Create the Like button
    UIButton *likeButton = [[UIButton alloc] initWithFrame:CGRectMake(260, 68, 40, 40)];
    [likeButton setImage:[UIImage imageNamed:@"thumbsUp"] forState:UIControlStateNormal];
    [likeButton setImage:[UIImage imageNamed:@"thumbsUpSelected"] forState:UIControlStateSelected];
    if (myRating == @"9") {
        [likeButton setSelected:YES];
    }
    [likeButton setTitle:@"9" forState:UIControlStateNormal];
    [likeButton setTag:indexPath.row];
    [cell.contentView addSubview:likeButton];
    [likeButton addTarget:self action:@selector(likeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (void)likeButtonPressed:(UIButton *)sender {

    // Changed the Selected state on the button
    UIButton *button = (UIButton *)sender;
    button.selected = !button.selected;

    // Create a new object with the user's rating and then replace it in the dataArray
    NSString *ratingText = sender.titleLabel.text;    
    NSMutableArray *myMutableArray = [[self.dataArray objectAtIndex:row] mutableCopy];
    [myMutableArray setValue:ratingText forKey:@"my_rating"];
    [self.dataArray replaceObjectAtIndex:row withObject:myMutableArray];
}

Итак, я прошел через многократные итерации, но не могу понять состояние кнопкипоказать выбранное изображение для тех элементов, которые понравились, и сохранить нормальное изображение для тех элементов, которые не понравились.

Любая помощь или совет будет принята с благодарностью.

Ответы [ 3 ]

9 голосов
/ 01 августа 2012

есть простой выход из этого.Вы можете нажать кнопку, чтобы оставаться в последнем выбранном состоянии.

создайте изменяемый массив, чтобы сохранить выбранное состояние кнопки

selectedButton = [[NSMutableArray alloc]init];//i've already defined the array at the .h file

for (int i = 0; i<yourTableSize; i++) //yourTableSize = how many rows u got
{
    [selectedButton addObject:@"NO"];
}

в методе tableviewcell, объявите вашу кнопку и установите ее так, чтобы она ссылалась на изменяемый массив наустановить его выбранное состояние

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) 
{ 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
}

UIImage *img = [UIImage imageNamed:@"btn_unselected.png"];
UIButton *toggleButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, img.size.width, img.size.height)];
[toggleButton setImage:img forState:UIControlStateNormal];
img = [UIImage imageNamed:@"btn_selected.png"];
[toggleButton setImage:img forState:UIControlStateSelected];
[toggleButton setTag:indexPath.row+100];//set the tag whichever way you wanted it, i set it this way so that the button will have tags that is corresponding with the table's indexpath.row
[toggleButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:toggleButton];

//and now we set the button's selected state, everytime the table reuse/redraw the cell the button will set it's selected state according to the array

if([[selectedButton objectAtIndex:indexPath.row]isEqualToString:@"NO"])
{
    [toggleButton setSelected:NO];
}
else 
{
    [toggleButton setSelected:YES];
}

return cell;

и, наконец, создать метод, который кнопка срабатывает при нажатии кнопки, чтобы изменить его выбранное состояние

-(void)buttonPressed:(UIButton*)sender
{
    int x = sender.tag - 100; //get the table's row
    if([sender isSelected]) //if the button is selected, deselect it, and then replace the "YES" in the array with "NO"
    {
        [selectedButton replaceObjectAtIndex:x withObject:@"NO"];
        [sender setSelected:NO];
    }
    else if (![sender isSelected]) //if the button is unselected, select it, and then replace the "NO" in the array with "YES"
    {
        [selectedButton replaceObjectAtIndex:x withObject:@"YES"];
        [sender setSelected:YES];
    }
}
4 голосов
/ 24 февраля 2012

Проблема в том, что каждый раз, когда вы создаете или повторно используете ячейку, вы даете ей новую кнопку «Нравится», поэтому, когда вы повторно используете ячейку, в которой была активирована кнопка «Нравится», вы даете ей деактивированную кнопку «Нравится», но старая, активированная кнопка «лайк» все еще там.

Вместо создания кнопки «лайк» каждый раз, когда вам нужна ячейка, вам просто нужно установить состояние существующей кнопки «лайк». См. Ответы на этот вопрос , чтобы узнать о некоторых возможных способах решения этой проблемы.

1 голос
/ 24 февраля 2012

Это недопустимо (по крайней мере, если вы пытаетесь сравнить строки моего содержимого вместо адресов):

if (myRating == @"9")

Попробуйте:

if ([myRating isEqualToString:@"9"])

И +1 кЮджи за то, что заметил создание нескольких кнопок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...