将出口连接到子类视图控制器

Posted

技术标签:

【中文标题】将出口连接到子类视图控制器【英文标题】:connecting outlets to a subclassed view controller 【发布时间】:2013-12-27 22:01:13 【问题描述】:

我正在学习 Paul Hegarty 在 iTunesU 上关于开发 ios7 应用程序的课程。在作业 3 中,我被要求将我的视图控制器抽象化,然后创建它的两个具体子类。原始视图控制器中的出口在.m 文件中声明如下:

@interface CardGameViewController ()

@property (weak, nonatomic) IBOutlet UIlabel *scorelabel;

@end

我的问题是CardGameViewController 的子类不知道这些属性,因为我认为它们是私有的。

在他的任务提示中,Paul 提出了一个想法来解决这个问题,而无需公开这些插座属性声明:

"如果你继承了 UIViewController 的子类,你可以连接到 超类的出路和动作只需手动打开 Xcode 助手编辑器中超类的代码(与 故事板)并像往常一样按住 ctrl 拖动到它。在 换句话说,您不需要创建超类的出口和 动作公开(通过将它们放在其头文件中)只是为了连接到 他们用 ctrl-drag (很可能实现这整个 分配而不公开单个出口或行动)。”

我的问题是:这是否意味着任何使用这些插座属性的代码都必须存在于超类实现中?或者有没有办法让我的子类访问这些属性?

【问题讨论】:

你正在使用的IDE(Xcode)与这个问题的连接在哪里? 原始视图控制器的出口连接是通过使用 Xcode 从故事板上的 UIView 拖动到视图控制器 .m 文件来实现的。 我明白你的意思,但我仍然不确定 Paul Hegarty 的以下提示是什么意思:“在 Objective-C 中没有像“受保护”这样的概念。不幸的是,如果一个子类想要要在代码中(不使用 ctrl-drag)向其超类发送消息,这些方法(包括属性)必须公开。一个好的面向对象设计通常会将内部实现的发布保持在最低限度!" 在某些语言中有一个protected 修饰符,这意味着访问将仅限于子类。在 Objective-C 中根本没有限制属性访问的方法,你所能做的就是改变它的可见性。如果一个类看不到一个属性,它就不能使用它——因此将它放在实现中是最接近私有化的方法。 【参考方案1】:

如果您想在子类中使用插座,您需要以某种方式使它们对子类可见。

您可以通过使它们公开可见来做到这一点 - 将它们放在标题中

您可以创建一个仅由子类导入的新标头(这就是UIGestureRecognizer 子类的工作方式)

@interface MyClass (ForSubclassEyesOnly)

@property (nonatomic, strong) id propertyThatYouWantToMakeVisibleToSubclass;

@end

【讨论】:

谢谢。我是这么想的。由于课程还没有涉及到这一点,并且由于作业提示说不要公开出口,我相信使用这些出口的代码必须驻留在超类中。【参考方案2】:

是的,你是对的。 他说:你不需要公开一个超类的出口和动作(通过把它们放在它的头文件中)只是为了用 ctrl-drag 连接它们。

这意味着您不需要公开超类的出口和操作,但它应该在实现文件中。

在他的教程中, scoreLabel 属性已经在 CardGameViewController 实现文件中。

【讨论】:

以上是关于将出口连接到子类视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 7 中将出口从文件连接到情节提要

文本字段创建操作而非出口

将 IBAction 连接到自定义类

将 UIView 添加到情节提要

将初始视图控制器连接到选项卡视图控制器

从 ViewController 到 UITableView 的 tableView 出口无效。插座无法连接到重复内容