无法在tableviewcell ios 7上显示删除按钮

Posted

技术标签:

【中文标题】无法在tableviewcell ios 7上显示删除按钮【英文标题】:Cannot show Delete button on tableviewcell ios 7 【发布时间】:2013-10-01 13:13:48 【问题描述】:

我使用UITableviewcellEditingstyleDelete 显示按钮,用户单击它以显示删除按钮(这与您在电子邮件应用程序上看到的方式相同,当用户单击编辑然后单击按钮以显示删除按钮时)。它在 ios6 中运行良好,但是当我在具有 ios 7 的设备上构建我的应用程序时,删除按钮消失了,但是当您点击删除按钮的区域时,它也可以删除。问题是用户看不到删除按钮(操作系统提供的红色按钮)。 我的代码是:

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

    // Detemine if it's in editing mode
    if (self.editing)
    
       return UITableViewCellEditingStyleDelete;
    

   return UITableViewCellEditingStyleNone;

请帮助我找到解决方案,我对iOS7环境了解不多。谢谢!

【问题讨论】:

UITableViewCell delete button gets covered up 的可能重复项 【参考方案1】:

感谢大家的建议,这个解决方案可以解决,我把它变成自定义单元格

 UIImageView* backgroundImage;

//Variable for animation delete button
// Keep the ContactView in normal state
BOOL bFirstEditingCell;
BOOL bShownRedMinus;
BOOL bShownDeleteButton;
CGRect frameOfContactViewInNormal;
CGPoint centerOfCellInNormal;
UITableViewCellAccessoryType accessoryTypeInNormal;

//

 - (id)initWithCoder:(NSCoder *)decoder

    if (self = [super initWithCoder:decoder])
    
        super.backgroundColor = [UIColor clearColor];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        backgroundImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_gradient" ]];
        self.backgroundView = backgroundImage;
        bShownDeleteButton = false;
        bShownRedMinus = false;
        bFirstEditingCell = true;
        accessoryTypeInNormal = UITableViewCellAccessoryNone;
    
    return self;



- (void)willTransitionToState:(UITableViewCellStateMask)state 
[super willTransitionToState:state];
if (!isOS7()) 
    return;


for (UIView *subview in self.subviews) 
    //Keep normal value of contact view and cell
    if (bFirstEditingCell   ) 
        frameOfContactViewInNormal = self->contactView.frame;
        frameOfContactViewInNormal.size.width = kContactViewWidth;
        centerOfCellInNormal = subview.center;
        bFirstEditingCell = false;
    

    if (state == UITableViewCellStateDefaultMask) 
        self.backgroundView = backgroundImage;
        subview.center = centerOfCellInNormal;
        //Set for position of speed dial image
        CGRect f = frameOfContactViewInNormal;
        if (bShownRedMinus) 
            f.size.width -= kRedMinusButtonWidth;
        
        self->contactView.frame = f;
        bShownDeleteButton = false;
        self.accessoryType = accessoryTypeInNormal;
    
    else if (state == UITableViewCellStateShowingDeleteConfirmationMask)
    
        float sectionIndexWidth = 0.0;

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
            sectionIndexWidth = 30.0;
        
        else 
            sectionIndexWidth = 15.0;
        
        CGPoint center = centerOfCellInNormal;
        subview.center = CGPointMake(center.x - sectionIndexWidth, center.y);
        self.backgroundView = nil;

        //Set width of contact name
        UIView* view = [subview.subviews objectAtIndex: 0];
        CGRect f = view.frame;
        f.origin.x = (kDeleteButtonWidth + sectionIndexWidth);
        view.frame = f;
        f = frameOfContactViewInNormal;
        f.size.width = self.frame.size.width - (kDeleteButtonWidth + sectionIndexWidth);
        self->contactView.frame = f;
        bShownDeleteButton = true;
        bShownRedMinus = false;
        accessoryTypeInNormal = self.accessoryType;
        self.accessoryType = UITableViewCellAccessoryNone;
    
    else if (state == UITableViewCellStateShowingEditControlMask) 
        CGRect f = frameOfContactViewInNormal;
        f.size.width -= 5;
        self->contactView.frame = f;
        bShownRedMinus = true;
    
    else if (state == 3)  //State for clicking red minus button
        CGRect f = frameOfContactViewInNormal;
        f.size.width += kRedMinusButtonWidth;
        self->contactView.frame = f;

        self.backgroundView = nil;
    


【讨论】:

【参考方案2】:

它看起来像是来自iOS 7 的错误之一。出于某种原因,backgroundViewiOS 移动到删除按钮上。您可以通过子类化您的backgroundView 并实现派生视图的setFrame 函数来解决此问题,如下所示:

UITableViewCell delete button gets covered up.


当指定accesoryView 并且editingAccessoryViewnil 时也可能发生这种情况。这里提到了这个问题和解决方案的详细解释:

UITableViewCell content overlaps delete button when in editing mode in iOS7.

【讨论】:

问题是我的背景视图的图像与删除按钮重叠,我还想为背景视图设置图像。我已经仔细阅读了你的推荐,但我不知道该怎么做。怎么能我对我的 bachgroundView 进行子分类?【参考方案3】:

你不需要检查tableView是否正在编辑...只需实现:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

       return UITableViewCellEditingStyleDelete;

【讨论】:

【参考方案4】:

消除此问题的最佳方法是在单元格中添加图像并将其设置在 Backside 中。

      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
      imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
      [yourCustomCell addSubview:imageView];
      [yourCustomCell sendSubviewToBack:imageView];

如果您的文本会与删除按钮重叠,则实施自动布局。它会以更好的方式管理它。

可以生成另一种情况,即 cellSelectionStyle 将使用默认颜色突出显示。您可以按如下方式设置高亮颜色

      yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;

 Set your table cell's selection style to UITableViewCellSelectionStyleNone. This will remove the blue background highlighting or other. Then, to make the text label or contentview highlighting work the way you want, use this method in yourCustomCell.m class.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated

    if (highlighted)
        self.contentView.backgroundColor = [UIColor greenColor];
     else
        self.contentView.backgroundColor = [UIColor clearColor];

希望能帮助你理解。

【讨论】:

这似乎是IOS 7的错误,所以我试过你的代码但它不影响。我认为,Vin的回答是正确的,但我不知道如何处理他的想法。 【参考方案5】:

更简单的解决方法

假设一个仅限 iOS7 的应用程序,其技术类似于上面 Vin 的帖子中链接的技术,我相信这里的方法:https://***.com/a/19416870/535054 会更干净。

在这种方法中,您不需要对 backgroundView 进行子类化,因为不同的单元格可能会有所不同。

将代码放在我上面链接到的答案中,在自定义表格单元格层次结构的根目录中,以及所有表格单元格(从它继承的)中,只要他们使用 backgroundView 或 selectedBackgroundView 属性就可以得到修复.

从这个要点复制解决方案:https://gist.github.com/idStar/7018104

【讨论】:

【参考方案6】:

解决此问题的一个简单方法是将delete confirmation button view 设为前视图。可以通过在customtableviewcell.m文件中实现委托方法layoutSubviews来完成。

在我的情况下,我通过将以下代码添加到 customtableviewcell.m 文件中来解决它。根据视图在单元格中的放置方式,它可能略有不同。但它肯定会给你一个关于如何解决问题的想法。

- (void)layoutSubviews // called when a interface orientation occur ie. in our case when the '-' button clicks

[super layoutSubviews];

for (UIView *subview in self.subviews)  // Loop through all the main views of cell

   // Check the view is DeleteConfirmationView or not, if yes bring it into the front 
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"])  

            [self bringSubviewToFront:subview];// code for bring the view into the front of all subviews

        

    

【讨论】:

以上是关于无法在tableviewcell ios 7上显示删除按钮的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - 故事板。为啥无法设置 tableViewCell 选择颜色

iOS 7 中自定义 TableViewCell 中的自动布局问题

IOS开发系列--TableView多个TableViewCell自定义CellCell上画画(故事板+代码方式),ios7tableview索引

为选定的 tableviewCell 的背景颜色设置框架在 iOS 7 中工作正常但在 iOS 6 中没有

无法单击 iOS 14 中 TableViewCell 内的按钮 [重复]

iOS7 上的 TableViewCell 中不会显示复选标记