使用故事板的ios视图控制器的公共基类

时间:2015-02-10 18:04:40

标签: ios objective-c iphone uiviewcontroller storyboard

我正在尝试使用基类MyBaseViewController,它是UIViewController的子类,用于我将在我的应用中使用的每个视图控制器,以便我可以在其中设置一些内容基本控制器以方便使用。

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

我希望MyTableViewController继承MyBaseViewController并实现UITableViewDelegateUITableViewDataSource,以便它可以正常使用表格视图,但是当我尝试为其设置类时我的故事板中的UITableViewController对象,它不允许我选择我写的自定义类。

我认为这是因为故事板要我使用UITableViewController的子类?

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

2 个答案:

答案 0 :(得分:1)

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

我不知道您在MyBaseViewController中设置了哪种默认设置,但如果您将其移至UIViewController的扩展名,则可以MyTableViewController和{{1}两者都调用相同的扩展方法。

答案 1 :(得分:0)

总之,没有。 UITableViewController已经定义了祖先。它直接从UIViewController继承。事后你不能插入新的祖先。

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

您可以定义自己的UIViewController子类来实现表视图委托和数据源方法,并使用它而不是UITableViewController作为表视图的基类,但是有些东西赢了&除非您的表格视图的主机是UITableViewController

,否则无法正常工作

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

您还可以创建一组方法,将其添加到UIViewController的自定义子类和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

(请注意,我是#include .m文件,而不是.h文件,#include进入实现,这是不寻常的。)

#include会导致编译器在两个类的主体中插入相同的源。这样,如果您更改额外方法的来源,则无需在2个位置更改它。

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