如何使用不同的 init 方法在 XIB 中创建自定义视图?

Posted

技术标签:

【中文标题】如何使用不同的 init 方法在 XIB 中创建自定义视图?【英文标题】:How can I create a custom view in XIB with different init method? 【发布时间】:2012-09-04 07:46:14 【问题描述】:

我知道如何在 xib 中布局和创建 UIView, 但现在我有一个自定义视图(UIView 的子视图), 它有不同的初始化方法,例如:

-(id)initWithArg1:(int) arg2:(NSString *) arg3:(NSArray *) ...

+(id)viewWithArg1:(int) arg2:(NSString *) arg3:(NSArray *) ...

当我在 xib 属性栏中将视图的类设置为我的时, 我的自定义初始化方法没有出现,无处可设置。

那怎么办?非常感谢。

【问题讨论】:

【参考方案1】:

您需要覆盖 initWithCoder: 并使用一些合理的默认值来完成指定的初始化程序正在执行的操作。

例如

- (id)initWithCoder:(NSCoder *)aDecoder

    if (self = [super initWithCoder:aDecoder]) 
        _value1 = 0;
        _value2 = @"Hi!";
        /* and so on */
    

    return self;

【讨论】:

【参考方案2】:

卡尔是正确的。

本质上,如果一个对象是从 XIB 实例化的(按照您在问题中提到的步骤),那么被调用的初始化程序是

- (id)initWithCoder:(NSCoder *)aDecoder;

您可以自己确认这一点,方法是覆盖所有可能的初始化程序并在所有初始化程序中放置断点以查看调用了哪个。

所以,如果您从 XIB 初始化,它暗示您将拥有该对象的一个​​实例(不一定如此);但是,如果您需要大量自定义对象的实例,那么您可能会考虑返回自定义初始化程序并通过以编程方式创建所有内容来放弃 XIB 工作。

本质上,想想你将如何使用这个对象。这将告诉您是否需要考虑以编程方式创建自己的视图的自定义初始化程序。

【讨论】:

是的,我认为它可以通过确认 并实现该方法来工作。我需要的只是布局我的视图,我可以通过编程设置其他变量。此外,我可以将它们设置为可见,如 UIKit 中的标准对象,设置标签的文本、颜色或其他内容吗?谢谢。 很高兴能帮上忙。标记和接受也总是有很长的路要走;-)【参考方案3】:

我认为您不需要在 xib 中设置init 方法,在其他地方您只需通过以下代码调用init

[[yourView alloc] initWithArg1:arg1 Arg2:arg2];

【讨论】:

那么他将如何在笔尖中使用他的视图?

以上是关于如何使用不同的 init 方法在 XIB 中创建自定义视图?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中创建自定义 xib 视图大小

如何在 Swift Xcode 中创建自定义导航栏?

如何在 Xcode 中创建自定义 UIView?

如何在 Sequelize 中的导入模型中创建自定义方法或函数

如何在 Blend 中创建自定义列表

如何在 Laravel 4.2 中创建自定义 DB Query Builder 方法