从同一个xib加载另一个UIView以添加为子视图

时间:2014-11-29 12:59:58

标签: ios objective-c uitableview xib

我有UITableView是故事板。 我尝试在Xib中创建UITableViewCell并在UITableView中注册它:

-(void)viewDidLoad{
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"FlipperTableViewCell" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"fliperCell"];
}

效果很好。

但是这个单元格内部必须有一个视图,并在第一个视图上的按钮按下时将其翻转到另一个视图。

我在同一个xib中创建另外两个视图。 File的所有者是FliperTableViewCell类。第一个视图类是FliperTableViewCell。 enter image description here

但现在无法弄清楚如何在第一个视图(UITableViewCell)中添加第二个视图(UIView)作为子视图,该视图由表视图加载。 我尝试从loadNibNamed:获得第二个视图,但它变成了无限循环。

@implementation FlipperTableViewCell
-(id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]){
        [self addSubview:[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil] objectAtIndex:1]];
    }
    return self;
}

从第一个视图加载后,从同一个xib获取第二个视图并将其添加为子视图的另一种方法是什么?

1 个答案:

答案 0 :(得分:0)

当我替换

时,问题解决了
[self.tableview registerNib:nib forCellReuseIdentifier:@"FlipperTableViewCell"];

[self.tableview registerClass:[FlipperTableViewCell class] forCellReuseIdentifier:@"FlipperTableViewCell"];

然后从xib中删除第一个视图并重写FlipperTableViewCell以在代码中启动

#import "FlipperTableViewCell.h"

@interface TableViewCell ()
@property (nonatomic, strong) UIView *firstView;
@property (nonatomic, strong) UIView *secondView;
@end

@implementation FlipperTableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]){
        NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil];
        self.firstView = nibObjects[0];
        self.secondView = nibObjects[1];
        [self.contentView addSubview:self.firstView];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    return self;
}

// this is for test changing views
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (self.contentView.subviews[0] == self.firstView){
        [self.firstView removeFromSuperview];
        [self.contentView addSubview:self.secondView];
    }
    else{
        [self.secondView removeFromSuperview];
        [self.contentView addSubview:self.firstView];
    }
}

@end