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

Posted

技术标签:

【中文标题】在实例化之前从 XIB 文件中读取属性【英文标题】:Read property from XIB file prior to instantiation 【发布时间】:2011-10-03 15:09:30 【问题描述】:

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

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

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

我考虑过的两种方法是:

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

我采用“垃圾实例”的方法,同时缓存笔尖和高度:

-(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];

【讨论】:

我有一段时间没有回到这个话题,所以我从来没有测试过这个解决方案。相反,我一直在避免 NIB 的扩散,而倾向于在代码中创建它们,在这种情况下,问题是没有实际意义的。但是,答案仍然可能是最佳选择,我将其标记为已接受。谢谢

以上是关于在实例化之前从 XIB 文件中读取属性的主要内容,如果未能解决你的问题,请参考以下文章

Xib 自定义 UIView 的实例化

从 XIB 问题动态实例化自定义 UIView(此代码有啥问题)?

如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView

nsobject 控制器跨两个 nib (xib) 文件链接。声明 nib 实例化

类的方法练习——定义MySQL类

旋转Xcode时不同的xib文件