【问题标题】:Remove Dynamically created UIButton Subview删除动态创建的 UIButton 子视图
【发布时间】: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];)。这不可能……

标签: ios objective-c uiview uibutton


【解决方案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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        相关资源
        最近更新 更多