无法将删除子视图置于前面

Posted

技术标签:

【中文标题】无法将删除子视图置于前面【英文标题】:Can't bring delete subview to front 【发布时间】:2014-03-03 01:01:42 【问题描述】:

我正在尝试将我的子视图放在前面,因为删除按钮一直消失。

@implementation MyCell : UITableViewCell

- (void)layoutSubviews

    [super layoutSubviews];

    for (UIView *subview in self.subviews) 

        for (UIView *subview2 in subview.subviews) 

            NSLog(@"HERE!");
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) 
                NSLog(@"got inside the if!");
                [subview2 sendSubviewToBack:subview];
                [subview bringSubviewToFront:subview2];
                [self.superview bringSubviewToFront:subview2];

            
        
    


@end

我继承了 UITableViewCell。两个 NSLog 都在打印,所以我知道它已经进入了那里,但是我已经尝试了所有 3 种方法来将视图放在前面。任何想法为什么这不起作用?

【问题讨论】:

您需要将所有自定义单元格的自定义视图放在单元格的self.contentView 中,而不是直接放在self 中。 改为喜欢这个[self.contentview sendSubviewToBack:subview]; [self.contentview bringSubviewToFront:subview2]; [self.contentview bringSubviewToFront:subview2]; 没有。添加子视图时,将它们添加到contentView。那么这些代码都不需要了。 摆脱这个layoutSubviews 方法。你不需要它。使用您将子视图添加到此自定义单元格的代码更新您的问题。 我从不添加子视图,我只是将样式设置为编辑。 【参考方案1】:

subview2subview 的子视图,self 的子视图。 sendSubviewToBack:bringSubviewToFront: 消息的接收者必须是作为参数给出的视图的父视图。因此,只有您拨打的第二个电话是有效的。正确的调用是

[self.superview bringSubviewToFront:self];
[self bringSubviewToFront:subview];
[subview bringSubviewToFront:subview2];

sendSubviewToBack: 也是如此。)

至于您的实际问题,我无法从发布的代码中找出您正在使用的视图层次结构,但它似乎不正确。您可能不应该将自定义视图作为self 的直接子视图,而是作为self.contentView 的子视图(根据Apple's documentation)。

【讨论】:

两种方法都试过了,点击减号按钮后删除按钮仍然消失。 我的视图层次结构非常简单,只是一个填充了 MyCells 的 UITableView,它继承自 UITableViewCell。 如何更改单元格的父视图?在 cellForRowAtIndexPath 里面?或者其他地方会更好吗? @Inbl 您不会更改单元格的父视图,而是更改添加自定义单元格子视图的方式。 我认为我从来没有向我的自定义单元格添加子视图,我只是将编辑样式设置为 YES。

以上是关于无法将删除子视图置于前面的主要内容,如果未能解决你的问题,请参考以下文章

如何将子视图从其父视图的父视图置于顶部

在 Swift 中选择时如何将子视图置于前面?

如何在不改变其位置的情况下在界面生成器中将子视图置于前面

将子视图置于前面

将先前添加的视图置于前面

如何在linearLayout中将视图置于最前面