Элемент управления изменением порядка UITableViewCell исчезает при прокрутке таблицы

#ios #uitableview

#iOS #uitableview

Вопрос:

В моем UITableView есть 2 настраиваемые ячейки: cell1 и cell2

Мой UITableView отображает одно или другое в зависимости от значения перечисления.

Если enumValue == 0, отображается ячейка1, и таблица не должна разрешать изменение порядка, если enumValue> 0, отображается ячейка2, и таблица должна разрешать изменение порядка

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

Моя проблема: когда элементы управления изменением порядка появляются в ячейке, они исчезают, когда строка прокручивается вне поля зрения. Почему это происходит?

Извините за форматирование и грубый код. У меня не было проблем с сайтом. Что-нибудь очевидное выделяется, что может быть причиной этого?

 > // enum
> 
> -(void)setScorePhase:(phase)scorePhase {
> 
>     _scorePhase = scorePhase;
>     
>     if (scorePhase > score) {
>         self.btnPrevious.hidden = NO;
>         [self.tableCorps setEditing:YES animated:YES];
>     } else {
>         self.btnPrevious.hidden = YES;
>         [self.tableCorps setEditing:NO animated:YES];
>     }
>     
>     switch (scorePhase) {
>         case score:
>             self.lblInstructions.text = @"Give your scores";
>             self.btnNext.titleLabel.text = @"Next";
>             break;
>         case bestdrums:
>             self.lblInstructions.text = @"Order the corps by best percussion";
>             self.btnNext.titleLabel.text = @"Next";
>             break;
>         case besthornline:
>             self.lblInstructions.text = @"Order the corps by best hornline";
>             self.btnNext.titleLabel.text = @"Next";
>             break;
>         case bestguard:
>             self.lblInstructions.text = @"Order the corps by best colorguard";
>             self.btnNext.titleLabel.text = @"Next";
>             break;
>         case loudesthornline:
>             self.lblInstructions.text = @"Order the corps by loudest hornline";
>             self.btnNext.titleLabel.text = @"Next";
>             break;
>         case favorite:
>             self.lblInstructions.text = @"Order the corps by your favorite";
>             self.btnNext.titleLabel.text = @"Submit";
>             break;
>             
>         default:
>             self.lblInstructions.text = @"Error";
>             break;
>     }
>     [self.tableCorps reloadData]; 
}




>

        -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    >         
    >         return 2;
    >     }
    >     
    >     -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    >         
    >         switch (section) {
    >             case 0: return @"World Class";
    >             case 1: return @"Open Class";
    >             default: return @"Error";
    >         }
    >     }
    >     
    >     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    >         
    >         if ([self.arrayOfPerformingCorps count]) {
    >             switch (section) {
    >                 case 0: return [self.arrayOfWorldClass count];
    >                 case 1: return [self.arrayOfOpenClass count];
    >                 default: return 0;
    >             }
    >         } else {
    >             return 0;
    >         }
    >     }
    >     
    >     -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    >         
    >         UITableViewCell *cell;
    >         if (self.scorePhase == score) {
    >             cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell1"];
>cell.showsReorderControl = NO;
    >             
    >         } else {
    >             cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell2"];
>cell.showsReorderControl = YES;
    >             
    >         }
    >         
    >         
    >         PFObject *corps;
    >         if ([self.arrayOfPerformingCorps count]) {
    >             if ((int)[indexPath section] == 0) {
    >                 corps = [self.arrayOfWorldClass objectAtIndex:[indexPath row]];
    >             } else {
    >                 corps = [self.arrayOfOpenClass objectAtIndex:[indexPath row]];
    >             }
    >             
    >             UILabel *corpsNameLabel = (UILabel *)[cell viewWithTag:0];
    >             corpsNameLabel.text = corps[@"corpsName"];
    >             
    >             
    >         } else {
    >             //cell.textLabel.text = @"";
    >             //cell.detailTextLabel.text = @"";
    >         }
    >         
    >         return cell;
    >     }
    >     
    >     #pragma  mark - Table Reordering
    >     - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    >         if (self.scorePhase > score) return YES;
    >         else return NO;
    >     }
    >     - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    >         return UITableViewCellEditingStyleNone;
    >     }
    >     - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    >         return NO;
    >     }
    >     - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    >         return YES;
    >     }
    >     - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
    > toIndexPath:(NSIndexPath *)destinationIndexPath{
    >         
    >     }
    >     
    >     - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath
    > *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
    >     {
    >         if (sourceIndexPath.section != proposedDestinationIndexPath.section) {
    >             NSInteger row = 0;
    >             if (sourceIndexPath.section < proposedDestinationIndexPath.section) {
    >                 row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1;
    >             }
    >             return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section];
    >         }
    >         
    >         return proposedDestinationIndexPath;
    >     }
 

Комментарии:

1. После дальнейшего тестирования я считаю, что это проблема бета-версии iOS 8.

2. Я тоже сталкиваюсь с той же проблемой. Я склонен полагать, что это проблема и с бета-версией iOS 8.

Ответ №1:

Это ошибка iOS 8. Простым обходным путем является переопределение prepareForReuse в UITableViewCell подклассе следующим образом:

 - (void)prepareForReuse
{
    [super prepareForReuse];
    [self setEditing:NO animated:NO];
}
 

Комментарии:

1. Большое спасибо! Кстати, это происходит и в iOS 8.1, и, похоже, это не бета-версия

2. Я тоже вижу это в 8.1, просто примечание, если вы не используете подкласс UITableViewCell, вы можете просто выполнить cell.editing = NO tableView:cellForRowAtIndexPath: вызов

Ответ №2:

У меня была такая же проблема в табличном представлении, где у меня были переупорядочиваемые ячейки, а не переупорядочиваемая ячейка. Я попробовал несколько решений (разные повторно используемые идентификаторы, …) решение, которое я нашел, состояло в том, чтобы установить для свойства showsReorderControl значение YES в моем установщике.

 self.showsReorderControl = reorderable;
[self setEditing:reorderable animated:NO];
 

Надеюсь, это поможет

Комментарии:

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

2. @Mustafa Я бы хотел, чтобы мой голос за ваш комментарий дал вам некоторую репутацию. 😉 Использование этого willDisplayCell метода in было отличным предложением 🙂

Ответ №3:

Я сталкиваюсь с той же проблемой с бета-версией iOS 8.

Я выяснил, что когда таблица находится в режиме редактирования, есть два представления, которые являются частью UITableViewCell, которые отвечают за редактирование таблицы; это UITableViewCellEditControl и UITableViewCellReorderControl. Оба этих представления присутствуют при создании таблицы в первый раз, и все работает нормально, но по мере перезагрузки / прокрутки таблицы эти представления исчезают.

Я думаю, что эта проблема связана с бета-версией, я попробовал ее с iOS 8 Beta 2 версии, и проблема все еще сохраняется.

Возможно, нам придется подождать следующего выпуска.

Комментарии:

1. Все еще сохраняется в версии iOS 8

Ответ №4:

У меня такая же проблема…IOS 8 beta 2.

Я выяснил, что проблема находится где-то в области ячейки «dequeueReusableCellWithIdentifier». Как только ячейки прокручиваются и используется повторно используемая ячейка, все удаляемые и перемещаемые изображения исчезают.

В качестве обходного пути (этот код все еще находится в стадии тестирования) я удалил код для повторного использования и регистрации ячеек…

 tableViewFromNib.registerClass(myViewControllerCell.self, forCellReuseIdentifier: cellReuseID)
     .
     .
let cell = tableView!.dequeueReusableCellWithIdentifier(cellReuseID, forIndexPath: indexPath) as myViewControllerCell 
 

и заменил его этим (в cellForRowAtIndexPath)…..

 let cell = UITableViewCell()
 

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

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

Ответ №5:

Проблема с бета-версией iOS 8. Не проблема с кодом.

Комментарии:

1. ОК. но это не решение!