【问题标题】:Common base class for ios view controllers using storyboards使用情节提要的 ios 视图控制器的通用基类
【发布时间】:2015-02-10 18:04:40
【问题描述】:

我正在尝试为我将在我的应用程序中使用的每个视图控制器使用基类 MyBaseViewController,它是 UIViewController 的子类,以便我可以在该基控制器中设置一些东西以方便使用.

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

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

我认为这是因为情节提要希望我使用 UITableViewController 的子类?

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

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller storyboard


    【解决方案1】:

    很遗憾没有。 Objective C 不支持多重继承。

    我不知道您在MyBaseViewController 中设置了什么样的默认值,但如果您将它们移至UIViewController 的扩展名,那么您可以让MyTableViewControllerMyBaseViewController 都调用相同的扩展方法.

    【讨论】:

    • 我不确定扩展是什么...它们是类别吗?我猜类别的问题只是它们不允许实例变量。
    • @a283626086 是的,与类别相同。是的,这是一个问题,但如果你想实现你所说的,那真的是唯一的方法。
    • 啊,我明白了。我想我得想办法了:\谢谢!
    • @a283626086 是的,对不起。但是,如果您想做一些运行时修改并在类别中添加属性,请使用:kaspermunck.github.io/2012/11/…
    • 哦,一切都好。我决定做出妥协,将我在故事板中的内容更改为 UIViewController,然后改用它。感谢您的链接!我会记住这一点,以防我将来需要这样做。
    【解决方案2】:

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

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

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

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

    您还可以创建一组方法,将它们添加到 UIViewController 的自定义子类和 UITableViewController 中。如果您将额外的源代码放入一个单独的源文件中,您可以在MyViewController.m 的正文中#include 该源文件。和你的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
    

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

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

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

    【讨论】:

    • 我明白了。如果我确实想继承实例变量该怎么办?我只是希望我的故事板中的 UITableViewController 可以使用不是UITableViewController 实例的自定义类。您还提到除非主机是UITableViewController,否则某些内容将无法正常工作,这些是什么?
    • 静态表格视图和单元格模板之类的东西假定包含视图控制器是 UITableViewController。我没有详尽的清单。我刚刚发现了一些不起作用的东西。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2013-10-21
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2012-06-22
    • 2014-04-19
    相关资源
    最近更新 更多