如何让我的 Nib 正确加载我自定义的 UIScrollView 子类?

Posted

技术标签:

【中文标题】如何让我的 Nib 正确加载我自定义的 UIScrollView 子类?【英文标题】:How can I make my Nib load correctly my customized UIScrollView subclass? 【发布时间】:2009-05-07 16:31:19 【问题描述】:

我的笔尖内有一个不错的 UIScrollView,效果很好。然后我有一些非常特殊的需求和子类化 UIScrollView。在我的 Nib 中,我将身份检查器中的类更改为我的子类。

但由于某种原因,当 nib 加载器从 nib 构建所有这些对象时,我的 -initWithFrame: 方法永远不会被调用。实际上我现在在我的子类中没有改变任何东西。滚动视图工作正常。期望它似乎是一个空白的 UIScrollView,即使我告诉 nib 它应该是一个用于测试目的的 SpecializedUIScrollView。

在子类化 UIScrollView 的同时仍使用 Nib 文件将其纳入透视图时,我还必须考虑其他事项吗?

我的专用初始化程序如下所示:

- (id)initWithFrame:(CGRect)frame 
    if (self = [super initWithFrame:frame]) 
        NSLog(@"Hello !!!!!!!!!!!!!");
    
    return self;

如果我尝试从 Nib 加载它,我永远不会在控制台中看到那个 Hello。当然,如果我自己分配和初始化它,它就可以工作。但是我不想以编程方式定位我的滚动视图,如果我可以使用该死的很酷的界面生成器。

【问题讨论】:

【参考方案1】:

nib 或 xib 中的对象存储为序列化对象,这可能意味着您必须使用 awakeFromNib 方法,因为从不调用 init 方法。

【讨论】:

【参考方案2】:

扩展initWithCoder,一定要调用super方法。正是在这个超级通话期间,setFrame 将在您的班级上被调用。

然后您可以在 initWithCoder 中重新使用您的标准 initWithFrame 调用,界面构建器将控制帧大小。

- (id)initWithCoder:(NSCoder *)aDecoder 
    [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
    return [self initWithFrame:[self frame]];

【讨论】:

以上是关于如何让我的 Nib 正确加载我自定义的 UIScrollView 子类?的主要内容,如果未能解决你的问题,请参考以下文章

加载不同的 Nib 文件

iOS 8 中 Nib 加载的子视图的位置不正确

如何在 SWIFT 中以编程方式将我的自定义控制器变成根控制器? (无法加载 NIB)

如何获取从 nib ios 加载的自定义视图的实际大小

。XIB / .NIB文件无法正确加载

为 UIView 子类加载 Nib 的正确方法