我的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;
> }
答案 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),例如UITableViewCellAccessoryDetailDisclosureButton,细节按钮在重复使用时将出现在两个位置:1)它在单元格右侧的预期位置,以及2)在单元格的左上角。
点击这两个按钮中的任何一个都可以正确调用accessoryButtonTapped:方法,但是,当然,只需要一个按钮。 :)
覆盖prepareForReuse,因为Vadim Yelagin也提议解决这个问题。
答案 5 :(得分:-1)
iOS 8测试版问题。不是代码问题。
答案 6 :(得分:-2)
请确保你们不会像我一样浪费6h调试....我设置了一个糟糕的布局,使得重新排序控制不在视图屏幕之外(就像我遇到的here)。因此,请确保您的自动布局不会中断您的应用