ios - 在实例化之前从 XIB 文件中读取属性

标签 ios cocoa xib

有几次我想在创建类的实例之前使用 XIB 文件中的值;我想到的两个是:

  • 计算表格单元格的高度 - 表格中的所有单元格都基于 XIB 的高度,如果显示更多信息,每个单元格可能会扩展,但“基本”高度应来自 XIB。
  • UIFont 和大小 - 将这些值复制为常量没有多大意义,但它们通常可用于计算单元格高度。

在这两种情况下,都需要在实例化 XIB 实例之前为 HeightForCell 计算单元格高度。

我考虑过的两种方法是:

  • 实例化 XIB 的垃圾实例,只是为了读取值。
  • 读取 XIB 文件本身以在不创建实例的情况下挑选出值。

尽管我对将 XIB 属性复制为常量感到恼火,但我没有(或没有)时间来实现这两种方法。

有没有其他人想出可行的解决方案,或者您只是忍受常量的重复?您认为以上哪种方法更好(更安全)?

谢谢。

最佳答案

我采用“垃圾实例”方法,缓存 Nib 和高度:

-(NSNib *)nibWithName:(NSString *)nibName {
    // Load the nib, or fetch it if we've already loaded it, then instantiate its contents
    NSNib *nib = [_itemViewNibs objectForKey:nibName];
    if (!nib) {
        nib = [[NSNib alloc] initWithNibNamed:nibName bundle:nil];
        [_itemViewNibs setObject:nib forKey:nibName];
    }
    return nib;
}

- (NSTableCellView *)firstTableCellInstantiatedFromNibWithName:(NSString *)nibName {
    NSArray *nibObjects;

    NSNib *nib = [self nibWithName:nibName];

    if (![nib instantiateNibWithOwner:self topLevelObjects:&nibObjects]) return nil;

    for (id obj in nibObjects)
        if ([obj isKindOfClass:[NSTableCellView class]])
            return (NSTableCellView *)obj;

    return nil;
}

- (CGFloat)tableCellHeightForNibName:(NSString *)nibName {
    NSNumber *height = [_itemViewHeights objectForKey:nibName];

    if (! height) {    
        NSTableCellView *view = [self firstTableCellInstantiatedFromNibWithName:nibName];
        height = [NSNumber numberWithFloat:view.frame.size.height];
        [_itemViewHeights setObject:height forKey:nibName];
    }

    return height.floatValue;
}

...

CGFloat height = [self tableCellHeightForNibName:item.nibName];

...

view = [self firstTableCellInstantiatedFromNibWithName:item.nibName];

关于ios - 在实例化之前从 XIB 文件中读取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7636888/

相关文章:

ios - 为什么 UIView 会同时调用 init 和 initWithFrame?

iphone - Objective-C 正则表达式

performance - 多少个 NSOperationQueue 才算太多?

objective-c - 如何使用 Cocoa 创建临时文件?

ios - 无法在自定义 View 中将边框颜色和背景显示为模糊,就像 Swift 中的弹出 View 一样

xcode - 如何清空缓存并清理所有目标 Xcode 4 及更高版本

ios - 如何在 Google Maps iOS SDK 上显示用户位置

iphone - CCAnimate 和 CCAnimation 有什么不同?

c# - cocoa 的属性网格

iphone - NIB 相关的崩溃在 iPad 但不是 iPhone