如何在运行时添加一个UIButton

16

我正在尝试在运行时添加一个UIButton,但它没有显示出来。我做错了什么?

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        UIButton *btn = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
        btn.frame = CGRectMake(0, 0, 100, 25);
        btn.backgroundColor = [UIColor clearColor];
        [btn setTitle:@"Play" forState:UIControlStateNormal];
        [btn addTarget:self action:@selector(buttonClick:)
        forControlEvents:UIControlEventTouchUpInside];
        btn.center = self.center;
        [self addSubview:btn];
    }
    return self;
}

3
这段代码会泄漏;你正在保留btn对象,但从未释放它。第一个保留消息是不必要的。 - Ben Gottlieb
我已经通过将UIButton视图添加到viewDidLoad的子视图中而非一些init方法中取得了良好的结果。 - Jens Kohl
我也遇到了同样的问题。实际问题是什么? - iOS
5个回答

9
首先,请确保已调用initWithFrame:方法。如果您的视图在Nib中,则将调用initWithCoder:方法。
其次,按钮是唯一的子视图吗(从您的代码中看起来是这样的,但你永远不知道)。按钮可能被隐藏在另一个子视图后面。如果需要,调用bringSubviewToFront:。
最后,请确认视图本身可见吗?它足够大以显示按钮吗?根据您的示例,如果视图小于100像素宽,则按钮不会显示,因为它将被视图的边界裁剪。

那么,是什么解决了它?这里有三种可能性...你能发一下代码吗?它是可行的。 - Joris van Liempd iDeveloper

1

你必须释放btn并在buttonClick中删除“:”:

UIButton *btn= [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
btn.frame = CGRectMake(0, 0, 100, 25);
btn.backgroundColor = [UIColor clearColor];
[btn setTitle:@"Play" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn]; 
[btn release];

说要在'buttonClick'中删除":"是不恰当的。默认处理程序是-(void)onClick:(id)sender。因此,需要使用“:”。如果处理程序没有输入,则是这样。释放的替代方法是在创建语句中自动释放按钮。 - GtotheB

0

首先检查您的代码是否正在执行initwithFrame方法。 因为如果您正在使用nib加载视图,即

NSArray *xibviews = [[NSBundle mainBundle] loadNibNamed: @"MySubview" owner: mySubview options: NULL];
MySubview *msView = [xibviews objectAtIndex: 0];
[self.view addSubview:msView]; 

那么,initWithFrame部分将不会执行。所以,请检查一下。


0
如果仍然无法正常工作,请尝试删除选择器名称末尾的冒号:@selector(buttonClick)。

0

你不需要保留UIButton,因为它已经被[self.view addSubview:btn];保留了。


这与 OP 的问题无关。 - user577537

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接