从另一个.m文件中获取项目的高度

时间:2015-02-02 02:52:46

标签: ios objective-c uitableview

我在UITableView中有一个自定义单元格。我以编程方式创建了一个高度为200,宽度为50的标签。当我在标签的宽度和高度的NSLog中进行customCell.m时,它给了我w:50和h:200。但是当我在NSLog中进行mainViewController.m时,它的高度和宽度为0。

不确定为什么会那样做。我需要在mainViewController.m

中获得标签的实际高度

这是我的代码:

customCell.m

- (void)awakeFromNib {

    self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 200)];
    [self.label setBackgroundColor:[UIColor yellowColor]];
    [self.label setText:@"Hello"];
    [self.myView addSubview:self.label];

    CGRect myFrame = self.myView.frame;
    myFrame.size.height = self.label.frame.size.height;

    self.myView.frame = myFrame;
    NSLog(@"%f", self.label.frame.size.height);  // Results: 200.0000
}

mainViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    customCell *cellVC = [[cutsomCell alloc] init];

    NSLog(@"%f, %f", cellVC.label.frame.size.height, cellVC.frame.size.height); // Results: 0.0000, 44.0000
}

我在storyBoard中将myView设置为0.

如果您不了解某些事情,请询问,我将很乐意解释。

更新

这是我的代码:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 200)];
    [self.label setBackgroundColor:[UIColor yellowColor]];
    [self.label setText:@"Hello"];
    [self.myView addSubview:self.label];
 view
    }
    return self;
}

viewDidLoad

[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"cellID"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *customCell = @"customCell";

    customCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[[NSBundle mainBundle] loadNibNamed:customCell owner:nil options:nil] objectAtIndex:0];
    }

    return cell;
}

现在的问题是,当我运行应用程序时,不会显示任何单元格。但我确实得到了正确的NSLog。

2 个答案:

答案 0 :(得分:1)

在你的mainViewController中,你只是用编程方式创建了cellVC然后使用init,你没有从nib创建它,就像你在customCell.m中创建它一样,因此没有调用awakeFromNib方法。

<强>更新 改回使用xib中的自定义单元格(而不是registerCell)

 [self.tableView registerNib:[UINib nibWithNibName:@"CustomCellxib"
                     bundle:[NSBundle mainBundle]]
     forCellReuseIdentifier:@"CustomCellReuseID"];    // in the viewDidLoad of the mainViewController

然后deque the cell - 你真的不需要检查单元格是否为nil,因为dequeue现在可以保证返回一个单元格

 CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellReuseID" forIndexPath:indexPath];
在tableview数据源方法中

保持awakeFromNib中当前的代码初始化从nib添加的自定义单元格。 xib中的默认单元格已在此处完全初始化,因此您应该能够自定义自定义视图。你不再需要initWithIdentifer了

您可以选择实现表视图委托方法,如:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // calculate the row height or return a constant
   return 200.0;
 }

答案 1 :(得分:0)

问题是-awakeFromNib在-init

之后没有被直接调用

试试这个:

- (instancetype)init {
    self = [super init];
    if (!self) {
      return nil;
    }

    self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 200)];
    [self.label setBackgroundColor:[UIColor yellowColor]];
    [self.label setText:@"Hello"];
    [self.myView addSubview:self.label];

    CGRect myFrame = self.myView.frame;
    myFrame.size.height = self.label.frame.size.height;

    self.myView.frame = myFrame;
    NSLog(@"%f", self.label.frame.size.height);  // Results: 200.0000

    return self;
}