使用故事板的 ios 视图控制器的共同基础 class
Common base class for ios view controllers using storyboards
我正在尝试使用基础 class MyBaseViewController
,它是 UIViewController
的子class,用于我将在我的应用程序中使用的每个视图控制器,这样我就可以在那个基本控制器中设置一些方便的东西。
我创建了一个故事板,里面有一个 UITableViewController
对象,我正在为它编写一个自定义控制器 class MyTableViewController
。
我想要 MyTableViewController
子 class MyBaseViewController
并实现 UITableViewDelegate
和 UITableViewDataSource
以便它在 table 视图中正常工作,但是当我试图在故事板中为 UITableViewController
对象设置 class 时,它不允许我 select 我写的自定义 class。
我想这是因为故事板要我使用 class,它是 UITableViewController
?
的子 class
有没有办法在不改变 MyTableViewController
的继承的情况下让它工作?
不幸的是没有。 Objective C 不支持多重继承。
我不知道您在 MyBaseViewController
中设置了哪种默认设置,但如果您将它们移至 UIViewController
的扩展名,则您可以拥有 MyTableViewController
和 MyBaseViewController
两者调用相同的扩展方法。
一句话,没有。 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 文件的目标成员资格复选框。您不希望单独编译它 - 只是通过预编译器粘贴到您的其他源文件中。
我正在尝试使用基础 class MyBaseViewController
,它是 UIViewController
的子class,用于我将在我的应用程序中使用的每个视图控制器,这样我就可以在那个基本控制器中设置一些方便的东西。
我创建了一个故事板,里面有一个 UITableViewController
对象,我正在为它编写一个自定义控制器 class MyTableViewController
。
我想要 MyTableViewController
子 class MyBaseViewController
并实现 UITableViewDelegate
和 UITableViewDataSource
以便它在 table 视图中正常工作,但是当我试图在故事板中为 UITableViewController
对象设置 class 时,它不允许我 select 我写的自定义 class。
我想这是因为故事板要我使用 class,它是 UITableViewController
?
有没有办法在不改变 MyTableViewController
的继承的情况下让它工作?
不幸的是没有。 Objective C 不支持多重继承。
我不知道您在 MyBaseViewController
中设置了哪种默认设置,但如果您将它们移至 UIViewController
的扩展名,则您可以拥有 MyTableViewController
和 MyBaseViewController
两者调用相同的扩展方法。
一句话,没有。 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 文件的目标成员资格复选框。您不希望单独编译它 - 只是通过预编译器粘贴到您的其他源文件中。