删除动态创建的 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 子视图的主要内容,如果未能解决你的问题,请参考以下文章