如何获得正确的框架,并且只在UITableViewCell中初始化一次?

时间:2015-03-22 01:27:52

标签: ios objective-c uitableview uibutton

我在UITableViewCell中以编程方式创建了几个UIButtons,并在layoutSubviews中设置了它的框架。我也在这里设置选定状态。

然而,似乎这不是创建或初始化按钮状态的最佳位置,因为多次调用layoutSubviews。我在哪里可以放下以下代码,使得框架正确,但只会初始化一次?

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width / 2.0, self.frame.size.height)];
button.selected = YES

我的一个想法是初始化awakeFromNib中的所有一次性设置,然后在layoutSubviews中进行实际的帧设置。这是一个好方法吗?

2 个答案:

答案 0 :(得分:1)

我建议将其放在

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

并使用Autolayout进行按钮放置。我将向您展示如何使用Masonry for Autolayout来保存线路。

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UIButton *button = [UIButton new];
        button.selected = YES;
        // Add button to self
        [self addSubview:button];

        [button mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.mas_top);
            make.left.equalTo(self.mas_left);
            make.width.mas_equalTo(self.view.frame.size.width/2);
            make.height.equalTo(self.mas_height);
        }

    }
    return self;
}

答案 1 :(得分:1)

如果您正在为自定义UITableViewCell类使用NIB文件,那么awakeFromNib是您应该初始化UITableViewCell类的UIElements,类属性和其他实例变量的方法。< / p>

否则,如果您使用的是自定义UITableViewCell课程而没有 NIB,那么您应该初始化

中的所有内容
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialize your frames here
    }
    return self;
}

现在,如果您想使用不同的按钮状态或数据更新您的单元格,那么您只需从

中调用单元格中的方法
- tableView:cellForRowAtIndexPath:

并为该特定单元格更改您想要的任何内容。

例如:

- tableView:(UITableView *)tableView cellForRowAtIndecPath:(NSIndexPath *)indexPath {

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    [cell someMethod];
    return cell;
}