将插座连接到子视图控制器

时间:2013-12-27 22:01:13

标签: objective-c inheritance uiviewcontroller ios7

我正在通过Paul Hegarty的iTunesU课程开发iOS7应用程序。在作业3中,我被要求使我的视图控制器抽象,然后制作它的两个具体子类。原始视图控制器中的出口在.m文件中声明如下:

@interface CardGameViewController ()

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

@end

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

在他对作业的暗示中,保罗提出了一个想法来解决这个问题而不公开这些出口财产声明:

  

“如果你是UIViewController的子类的子类,你可以连接到   超级的出口和行动只需手动打开   Xcode中助理编辑器中的超类代码(与...并排)   故事板)并像往常一样按住Ctrl键拖动它。在   换句话说,你不需要建立一个超级类别的网点   公共行动(通过将它们放在其头文件中)只是为了连接到   用ctrl-drag来实现它们(很有可能实现这一切   没有单独出口或行动公开的任务。“

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

2 个答案:

答案 0 :(得分:1)

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

您可以通过公开显示它们来实现此目的 - 将它们放在标题

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

@interface MyClass (ForSubclassEyesOnly)

@property (nonatomic, strong) id propertyThatYouWantToMakeVisibleToSubclass;

@end

答案 1 :(得分:0)

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

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

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