滚动表时,UITableViewCell重新排序控件消失

时间:2014-06-20 19:23:51

标签: ios uitableview

我的UITableView有2个自定义单元格:cell1&小区2

我的UITableView根据枚举值显示一个或另一个。

如果enumValue == 0,则显示cell1,表格不允许重新排序 如果enumValue> 0,显示cell2,表格应允许重新排序

一切正常。随着枚举值的变化,重新排序控件会正确显示。

我的问题:当重新排序控件出现在单元格上时,当该行滚出视图时,它们将消失。为什么会这样?

抱歉格式化和粗略的代码。我对该网站没有任何疑问。有什么突出的东西可能导致这个?

> // 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;
    >     }

7 个答案:

答案 0 :(得分:18)

这是iOS 8的错误。一个简单的解决方法是覆盖prepareForReuse子类中的UITableViewCell,如下所示:

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

答案 1 :(得分:2)

我在表格视图中遇到了同样的问题,其中我有可重新排序的单元格,而不是可重新排序的单元格。 我尝试了一些解决方案(不同的可重用标识符,......)我找到的解决方案是在我的setter中将属性showsReorderControl设置为YES。

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

希望有所帮助

答案 2 :(得分:0)

iOS 8测试版面临同样的问题。

我知道当表处于编辑模式时,有两个视图是UITableViewCell的一部分,负责表编辑;这些是UITableViewCellEditControl和UITableViewCellReorderControl。 在第一次创建表时,这两个视图都存在,并且一切正常,但随着表重新加载/滚动,这些视图将消失。

我认为这个问题与Beta版本有关,我尝试使用iOS 8 Beta 2版本,问题仍然存在。

我们可能要等下一个版本。

答案 3 :(得分:0)

我一直有同样的问题...... IOS 8 beta 2。

我已经发现问题出现在单元格的某个地方&#34; dequeueReusableCellWithIdentifier&#34;区域。一旦滚动单元格并使用可重复使用的单元格,所有删除和移动图像都会消失。

作为一种解决方法(此代码仍在测试中),我拿出了重用和注册单元格的代码......

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

并将其替换为(在cellForRowAtIndexPath中).....

let cell = UITableViewCell()

....一切正常。我知道这不是一个真正的解决方案(许多未使用的单元飞来飞去),但它已经让我超越了进一步编码的问题。我将在问题解决后再回来并添加出列代码。

PS ...这可能是一个评论,但我刚开始stackoverflow并没有足够的评论点。

答案 4 :(得分:0)

没有足够的声誉点直接评论帖子,但我在iOS 10中遇到了Vadim Yelagin解决方案解决的相关问题。

如果UITableViewCell子类处于编辑状态,并且同时显示重新排序控件和详细按钮(包围i),例如UITableViewCellAccessoryDe​​tailDisclosureButton,细节按钮在重复使用时将出现在两个位置:1)它在单元格右侧的预期位置,以及2)在单元格的左上角。

点击这两个按钮中的任何一个都可以正确调用accessoryButtonTapped:方法,但是,当然,只需要一个按钮。 :)

覆盖prepareForReuse,因为Vadim Yelagin也提议解决这个问题。

答案 5 :(得分:-1)

iOS 8测试版问题。不是代码问题。

答案 6 :(得分:-2)

请确保你们不会像我一样浪费6h调试....我设置了一个糟糕的布局,使得重新排序控制不在视图屏幕之外(就像我遇到的here)。因此,请确保您的自动布局不会中断您的应用