我正在尝试使用基类MyBaseViewController
,它是UIViewController
的子类,用于我将在我的应用中使用的每个视图控制器,以便我可以在其中设置一些内容基本控制器以方便使用。
我创建了一个带有UITableViewController
对象的故事板,我正在为它编写一个自定义控制器类MyTableViewController
。
我希望MyTableViewController
继承MyBaseViewController
并实现UITableViewDelegate
和UITableViewDataSource
,以便它可以正常使用表格视图,但是当我尝试为其设置类时我的故事板中的UITableViewController
对象,它不允许我选择我写的自定义类。
我认为这是因为故事板要我使用UITableViewController
的子类?
有没有办法在不改变MyTableViewController
继承的情况下让它工作?
答案 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文件的目标成员资格复选框。您不希望单独编译 - 只是由预编译器粘贴到您的其他源文件中。