删除动态创建的 UIButton 子视图

Posted

技术标签:

【中文标题】删除动态创建的 UIButton 子视图【英文标题】:Remove Dynamically created UIButton Subview 【发布时间】:2013-10-31 11:53:29 【问题描述】:

在@Midhun MP 在这个问题的帮助下,我已将自定义徽章应用为 UIButton 的子视图 - Adding a subview to UIButton。

一切都很好 - 但我现在尝试在单击按钮时删除子视图。

我已经设置了一个通过点击其中一个按钮触发的方法

- (void)hide

    //Hide Buttons
    _importantMsg.hidden = YES;


    [CustomBadge removeFromSuperview];


但我正在努力隐藏子视图 - 我已经尝试过 -

[CustomBadge removeFromSuperview];

_MsgHeadBtn.subviews.hidden = YES;;

但我收到未知的接收器错误 - 谁能指出我正确的方向吗?

每次尝试的错误显示在下面的屏幕截图中 -

【问题讨论】:

可以告诉我们什么错误? removeFromSuperview 应该可以工作。 @JayGajjar - 是的 - 刚刚添加了截图 customBadge 找不到。另外,subviews 是一个 NSArray,它没有隐藏属性。 看起来您正在调用类方法 ([CustomBadge removeFromSuperview];)。这不可能…… 【参考方案1】:

您需要对自定义视图的引用以便将其删除,iVar 或给视图一个标签,然后使用按钮 viewForTag 方法并以这种方式删除。

@implementation ViewController 
   UIView *_customView;


-(void)addCustomsubView

   _customView = [UIView alloc] init …./ your initialize

   [button addSubView:_customView];


- (void)hide

   [_customView removeFromSuperView];
   _customView = nil;

【讨论】:

试试 _customView.hidden = YES;看看是否隐藏它,如果它隐藏了,那么从超级视图中删除 customView 是问题 完美运行 - 仅使用 hidden = yes 有问题吗? 那么 removeFromSuperView 应该可以工作,这是围绕这个问题的主要问题,隐藏只是为了验证它是否仍然连接到 iVar,但在这种情况下 removeFromSuperView 应该可以正常工作。您可以使用标签创建并使用 viewForTag 来验证,因为 removeFromSuperView 应该可以正常工作【参考方案2】:

试试这个

动态创建按钮时可以有按钮引用的方法。

 -(void)hide:(UIButton *)sender
 
   for(UIView *viewRef in sender.subviews)
    
     if(viewRef isKindofClass:[CustomBadge class])
     
      [viewRef removeFromSuperview];
     
    

 

【讨论】:

【参考方案3】:

第一个问题是_MsgHeadBtn.subviews.hidden = YES; .subviews 是一个数组,您不能对其执行 setHidden 选择器。第二个问题是,如果您在之后立即删除视图,则隐藏视图毫无意义。第三个问题是

 [CustomBadge removeFromSuperview];

CustomBadge 不是类的实例,也不是对象,它只是一个类。理论上的方法就像

-(void)addSomeView 
    //customBadge MUST be an instance variable or a property, otherwise you are not holding a reference to it so you can access it later
    customBadge = [[CustomBagde alloc] initWith...];
    [yourButton addSubView:customBadge];



-(void)hide 
    //This is where the app will crash if customBadge is not a property or an instance variable
    [customBadge removeFromSuperView];

【讨论】:

【参考方案4】:

您可以在自定义子视图上使用标签稍后将其删除。使用它来添加您的自定义视图:

customBadge1.tag=1;
[_MsgHeadBtn addSubview:customBadge1];

然后删除它

customBadge=[_MsgHeadBtn viewWithTag:1];
[customBadge removeFromSuperview]

【讨论】:

以上是关于删除动态创建的 UIButton 子视图的主要内容,如果未能解决你的问题,请参考以下文章

用户单击按钮时如何动态创建和删除视图[重复]

如何删除多个 UIButton 或动态创建的特定 UIButton?

使用自动布局约束动态创建视图?在Objective-C中?

处理点击动态创建布局android的子布局

无法在 uiview 中动态居中自定义 uibutton

如何为 iOS 应用动态设计或创建带有动态 ui 控件的视图