使用故事板的 ios 视图控制器的共同基础 class

Common base class for ios view controllers using storyboards

我正在尝试使用基础 class MyBaseViewController,它是 UIViewController 的子class,用于我将在我的应用程序中使用的每个视图控制器,这样我就可以在那个基本控制器中设置一些方便的东西。

我创建了一个故事板,里面有一个 UITableViewController 对象,我正在为它编写一个自定义控制器 class MyTableViewController

我想要 MyTableViewController 子 class MyBaseViewController 并实现 UITableViewDelegateUITableViewDataSource 以便它在 table 视图中正常工作,但是当我试图在故事板中为 UITableViewController 对象设置 class 时,它不允许我 select 我写的自定义 class。

我想这是因为故事板要我使用 class,它是 UITableViewController?

的子 class

有没有办法在不改变 MyTableViewController 的继承的情况下让它工作?

不幸的是没有。 Objective C 不支持多重继承。

我不知道您在 MyBaseViewController 中设置了哪种默认设置,但如果您将它们移至 UIViewController 的扩展名,则您可以拥有 MyTableViewControllerMyBaseViewController 两者调用相同的扩展方法。

一句话,没有。 UITableViewController的祖先已经确定。它直接继承自 UIViewController。您不能在事后插入新的祖先。

Objective-C 没有多重继承,这会让这很容易。

您可以定义自己的 UIViewController 的子 class 实现 table 视图委托和数据源方法,并使用它代替 UITableViewController 作为table 视图的基础 class,但除非您的 table 视图的宿主是 UITableViewController.

,否则有些事情将无法工作

如果您不需要向视图控制器添加实例变量或覆盖现有方法,您可以定义一个 UIController 类别 (UIViewController+MyMethods)。

您还可以创建一组方法,将其添加到 UIViewController 的自定义子 class 和 UITableViewController 中。如果您将额外的源代码放入一个单独的源文件中,您可以 #include 在您的 MyViewController.m 正文中那个源文件。和你的 MyTableViewController.m 个文件:

您可能有一个文件 ExtraVCMethods.m:

- (void) methodOne
{
  //code
}

- (void) methodTwo
{
  //code
}

然后在你的 MyViewController.m:

@implementation MyViewController

#include "ExtraVCMethods.m"

@end

在你的 MyTableViewController.m 中:

@implementation MyTableViewController

#include "ExtraVCMethods.m"

@end

(请注意,我#including 一个 .m 文件,而不是一个 .h 文件,并且 #include 进入实现内部,这是不寻常的。)

#include 会导致编译器在两个 class 的正文中插入相同的源代码。这样,如果您更改额外方法的源代码,则不必在 2 个地方进行更改。

请注意,使用上述方法,您可以关闭 ExtraVCMethods.m 文件的目标成员资格复选框。您不希望单独编译它 - 只是通过预编译器粘贴到您的其他源文件中。