如何初始化 UITableView?来自 XIB 和以编程方式?

Posted

技术标签:

【中文标题】如何初始化 UITableView?来自 XIB 和以编程方式?【英文标题】:How to initialize UITableView? Both from XIB and programmatically? 【发布时间】:2009-12-02 00:33:40 【问题描述】:

我有一个简单的请求,我花了很多时间(尴尬地)..

我对 UITableView 进行了子分类以添加一些功能。这些新功能需要像 NSMutableSet 这样需要分配/初始化的东西。

我已将对象的初始化例程放入

- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style 

我从苹果文档中了解到要更正 - 但这不会被调用(由代码上的断点确定)。

我正在使用 IB,并将UITableView 拖到视图上,并将其类更改为我的新子类。没有UITableViewController。 我也试过:

- (void)loadView 
- (id)init 
- (id)initWithFrame:(CGRect)frame 

没有成功。我希望这门课既能与 IB 一起工作,又能在未来以编程方式工作。除了这个初始化的位置之外,一切都有效..

【问题讨论】:

【参考方案1】:

当从 XIB 文件加载对象时,它们会得到 -(id)initWithCoder:(NSCoder*)coder

如果您从 XIB 以编程方式创建对象,则需要同时实现指定的初始化程序 -initWithFrame:style: -initWithCoder:,在每个初始化程序中执行所有初始化操作。

使这两者保持同步可能会很痛苦,因此大多数人喜欢将 init 内容分解为私有方法,通常称为 -commonInit

您可以在一些 Apple 示例代码中看到一个这样的示例:HeadsUpUI。

- (void)commonInit

    self.userInteractionEnabled = YES;


- (id)initWithFrame:(CGRect)frame

    if (self = [super initWithFrame:frame])
    
        [self commonInit];
    
    return self;


- (id)initWithCoder:(NSCoder *)aDecoder

    if (self = [super initWithCoder:aDecoder])
    
        [self commonInit];
    
    return self;

【讨论】:

完美 - 谢谢保罗。你不知道我试图在文档和在线中找到它多久了。我发现必须通过整个超类的层次结构来找出给定类的行为/属性是令人沮丧的。希望我能学到一些有用的经验法则——我对 Obj-C 还很陌生。再次感谢。非常感谢..【参考方案2】:

人们在刚接触 Cocoa 或 Cocoa Touch 时常犯的一个错误是,在他们实际上不需要的时候进行子类化。我见过许多不需要编写的自定义窗口、表格视图、滚动视图和图像视图的示例。

您要向 UITableView 添加什么功能?您确定无法通过委托方法或使用自定义单元类来完成您想做的事情吗?

【讨论】:

我已添加到标准 UITableView 中,以便在点击任何部分标题时向其委托发送消息。 (我用它来缩小那个部分以减少空间)。不过,我感谢您的建议.. 谢谢..

以上是关于如何初始化 UITableView?来自 XIB 和以编程方式?的主要内容,如果未能解决你的问题,请参考以下文章

来自xib的UITableView中没有数据

来自 XIB 错误的 UITableView 和 UITableViewCell?

如何在 xib 上设置静态 UITableview?

iPhone:如何制作透明的 XIB,从中我们可以看到以前视图的 uitableview

如何将 UITableView 作为子视图添加到 xib 中的 UIView?

来自 .xib 文件的自定义 UITableViewCell