当前位置:  开发笔记 > IOS > 正文

为UITableViewController子类重写哪些初始化程序

如何解决《为UITableViewController子类重写哪些初始化程序》经验,为你挑选了2个好方法。

我有一个UITableViewController实例化的子类,取决于它在哪里使用,在NIB中或通过代码.在这两种情况下,我都想在初始化方法中进行自定义.这是否意味着我必须实现initWithNibName:bundle: initWithCoder:,并且将每个方法调用它的各超初始化?

虽然我现在不需要这个,但是如果我也希望能够实例化视图控制器initWithStyle:呢?那么我是否需要3种不同的init方法来复制相同的行为?

这似乎违反了整个指定的初始化程序约定,因为基本上会有3个单独的初始化程序不会最终调用公共init方法.或者有没有办法在支持3种不同的实例化路由时创建公共指定的初始化程序?



1> Daniel Dicki..:

我的困惑是基于错误的信念,即每个类应该有一个指定的初始化器.这不是真的,如果UITableViewController有3个指定的初始化器(据我所知):

    initWithStyle: 在当地宣布

    initWithNibName:bundle: 继承自 UIViewController

    initWithCoder:从采用NSCoding协议

您需要在子类中覆盖其中的一个或多个,具体取决于子类的实例化方式.在我的情况下,我必须实现#2和#3,因为类可以从NIB加载,或者通过代码参考NIB实例化.(我想这是罕见的,你会同时使用initWithStyle:,并initWithNibName:bundle:为一个单一的类.)

我发现Apple的Cocoa编码指南很有帮助.



2> kennytm..:

在内部,

UITableViewController -initWithStyle:调用super -init然后设置_tableViewStyleivar.

UIViewController -init只是-initWithNibName:bundle:使用默认参数调用.

UITableViewController 不会覆盖-initWithNibName:bundle:.

因此,如果你覆盖-initWithNibName:bundle:那么-initWithStyle:也会采用变化.当然,为了安全起见(因为您不应该依赖于实现细节),请覆盖它们.

(-initWithCoder:除非您取消/归档实例,否则无需覆盖.)

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有