1

我在向我UITableViewCell的 中添加按钮时遇到问题,单元格有两个UILabels 和两个UIImageViews,有时UIImageView会包含一个图像,有时会包含一个按钮:

在此处输入图像描述

在我的UITableViewCell子类中,我有:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if ( self ) {
        // Initialization code

    firstLock = [[UILabel alloc]init];
    [firstLock setBackgroundColor:[UIColor clearColor]];
    firstLock.textAlignment = UITextAlignmentLeft;
    firstLock.font = [UIFont fontWithName:@"Arial-BoldMT" size:17];

    secondLock= [[UILabel alloc]init];
    [secondLock setBackgroundColor:[UIColor clearColor]];
    secondLock.textAlignment = UITextAlignmentRight;
    secondLock.font = [UIFont fontWithName:@"Arial-BoldMT" size:17];

    firstLockImage = [[UIImageView alloc]init];

    secondLockImage = [[UIImageView alloc] init];

    [self.contentView addSubview:firstLock];
    [self.contentView addSubview:secondLock];
    [self.contentView addSubview:firstLockImage];
    [self.contentView addSubview:secondLockImage];
    }
    return self;
}

当其中一个UIImageViews 只是一个图像时没问题,但是当我添加一个UIButton(imaged) 作为子视图时它会崩溃。

UITableViewDataSource实施中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{



UIImage *btnImage = [UIImage imageNamed:@"bike_ok.png"];

UIButton *button =[UIButton alloc];
[button setImage:btnImage forState:UIControlStateNormal];

[cell.secondLockImage addSubview:button];

添加按钮作为图像视图的子视图崩溃:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Requesting the window of a view (<UIButton: 0x7bac7d0; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = (null)>) with a nil layer. This view probably hasn't received initWithFrame: or initWithCoder:.'
*** First throw call stack:

我错过了什么?

谢谢!

只需添加!这条线很重要

    [firstLockImage setUserInteractionEnabled:YES];
    [secondLockImage setUserInteractionEnabled:YES];

因为 UIImageView 默认设置为 NO 并且没有它按钮将无法工作!

4

3 回答 3

5

如果您阅读了崩溃错误,则很容易看出您的问题出在哪里。你还没有初始化你的按钮。

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0,0,0,0)];

或者您可以使用 initWithCoder。

希望这可以帮助

山姆

于 2012-09-05T08:44:01.210 回答
1

更改UIButton *button =[UIButton alloc];alloc w/o init?)为

UIButton *button =[UIButton buttonWithType:UIButtonTypeCustom];
//set frame
[button setFrame:(CGRect){x,y,w,h}];

+buttonWithType处理 UIButton 对象的分配/初始化

于 2012-09-05T08:51:00.600 回答
1

阅读异常文本 - 它说:

此视图可能尚未收到 initWithFrame: 或 initWithCoder:

只需在您的问题中列出几行,您正在向一个UIButton实例发送消息,而该实例您只有alloc'd 而没有发送任何init...消息。那是你的错误。

此外,您不应该直接调用alloc/init对,UIButton因为它是一个类集群,您通常应该使用它+[UIButton buttonWithType:]来获取按钮实例。

编辑实际上,我对此不是 100% 确定的。但是你并不真正知道如果你这样做会得到什么initWithFrame:,我仍然会去buttonWithType:获得一个自定义按钮,这就是你想要的。结束编辑

因此,将该行更改为:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

希望这可以帮助!

于 2012-09-05T08:43:51.287 回答