Как сохранить выбранное состояние, когда нажимает UIButton в iPhone? - PullRequest
3 голосов
/ 11 января 2011

Я создал три кнопки и установил фоновое изображение для нормального состояния и выбранного состояния.Когда я нажимаю кнопку, изменил одно изображение в качестве выбранного состояния.Но когда выполняется прокрутка табличного представления, выбранное изображение не сохраняется (предыдущая выбранная ячейка), что означает, что оно приходит в нормальное состояние.

Мой код:

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

    likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];

    //set image as background for button in the normal state

    [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];

    [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];

   [cell.contentView addSubview:likeBtn];
 }

Действие Моя кнопка

 -(void) likeAction : (id) sender
 {
     UIImage *likeSelectedImg = [UIImage imageNamed:@"like-selected.png"];

     UIImage *likeImg = [UIImage imageNamed:@"like.png"];

           if ([sender isSelected]) {
               [sender setImage:likeImg forState:UIControlStateNormal];
               [sender setSelected:NO];
               }else {
               [sender setImage:likeSelectedImg forState:UIControlStateSelected];
               [sender setSelected:YES];
          }

 }

Так что моя проблема в том, что, когда я прокручиваю ячейку табличного представления, ранее выбранное состояние изображения не сохраняется.Потому что метод cellForRowAtIndex неоднократно вызывался, когда я прокручивал таблицу.поэтому он автоматически устанавливает "[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];".Как избежать этой проблемы?Так что, пожалуйста, помогите мне?Спасибо!

Ответы [ 4 ]

5 голосов
/ 11 января 2011

Вы видите это из-за шаблона проектирования, который UITableView использует для отображения данных. Чтобы свести к минимуму использование ресурсов, только ячейки таблицы, которые в данный момент находятся на экране, гарантированно хранятся в памяти. Поскольку ячейки прокручиваются за пределами экрана, объекты ячеек предназначены для повторного использования, чтобы использовать их для появления новой ячейки на другом конце списка и, следовательно, потери их состояния.

Я предполагаю, что вы несколько урезали свой код, когда возвращаете ячейку в tableView: cellForRowAtIndexPath:, но в опубликованном вами фрагменте нет ссылки на эту переменную. Это делает невозможным увидеть, как вы получаете ячейку, прежде чем добавить кнопку.

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

  1. Создайте некоторое хранилище уровня контроллера, такое как NSArray, для хранения всех ваших состояний кнопок для всех строк таблицы.
  2. В likeAction определите, из какой строки кнопка (возможно, назначьте номер строки свойству tag кнопки при ее создании) и обновите состояние для соответствующей строки в вашем NSArray
  3. В tableView: cellForRowAtIndexPath: установите для вашей кнопки правильное изображение, используя состояние, которое выбирается из NSArray для заданного indexPath.
1 голос
/ 11 января 2011

вышеуказанный код неверен в синтаксисе:

cell = [[[ToDoSummaryTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

присвойте каждой ячейке уникальный идентификатор, он должен работать.

См. Любой пример кода, который использует 'reuseidentifier' в API XCode IOS.

Спасибо, Бхарат

0 голосов
/ 28 июля 2011

Я заново отредактировал ваш код выше.Надеюсь, я вам помогу.

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

       likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

       UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];

       //set image as background for button in the normal state

       [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];
       [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateHighlighted];

       [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];

       [cell.contentView addSubview:likeBtn];
}
0 голосов
/ 11 января 2011

Вы можете использовать reuseIdentifier для каждой ячейки с идентификатором.

cell = [[[ToDoSummaryTableViewCell alloc] 
                     initWithStyle:UITableViewCellStyleDefault reuseIdentifier:.<identifier>] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...