在iOS中,如何子类化UIViewController?

3

我在iOS中对子类化UIViewController感到困惑,我有一个父视图控制器,它符合UICollectionViewDataSource协议(在其实现文件中的私有接口中)。

/* Parent.m */

@interface Parent () <UICollectionViewDataSource>

// this CollectionView is connected to storyboard
@property (weak, nonatomic) IBOutlet UICollectionView *CollectionView;

@end


@implementation Parent


- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.somecount;
}

@end

然后我创建了一个继承自父视图控制器的子视图控制器。由于数据源是在父视图控制器的私有接口中实现的,因此子视图控制器对UICollectionViewDataSource一无所知。

/* child.h */

@interface child : parent
// nothing was mentioned here that parent has a method to set the count using 'somecount'
@end

然后我将主storyboard中的视图控制器设置为子视图控制器。

iOS如何从父属性'somecount'获取值并为子项设置值?

谢谢。

1个回答

2
你问:
为什么 iOS 能从父类的属性 somecount 获取值并将其设置给子类?
子类总是继承其 super 类的属性和方法。它们可能是公共接口,也可能不是(你没有展示出 somecount 的声明,所以我们不知道),但无论如何,它们都在那里,并且会在运行时解析(除非你在 child 中覆盖这些方法/属性,但你似乎没有这样做)。如果在 parent 中存在私有方法和属性,则在 compile-time 时可能无法从 child 中看到它们,但它们仍然存在,并且在运行时会正常工作。
因此,当带有 collection view 的场景将 child 指定为 collection view 的数据源时,如果 child 没有实现那些 UICollectionViewDataSource 方法,则它将自动调用 parent 的方法。同样,当任何一个方法引用 somecount 时,如果 child 没有覆盖它,它将再次调用 parent 的适当访问器方法。最重要的是,child 自动继承了 parent 的所有行为、方法和属性。

让我把我的问题表达清楚:
  1. 如何找出从应用程序启动开始调用的代码流,是否有任何方法可以从Storyboard的最初开始进行调试?即初始化Storyboard--初始化集合视图--初始化集合视图控制器--还是先初始化父级?
  2. 你提到“底线是,子类自动继承父类的所有行为、方法和属性。”这是否意味着子类也会有私有属性(在父类中声明)?但子类在编译时无法访问它们?我怎么不能访问自己的属性?
- Justin
请查看CardGameViewController和PlayingCardGameViewController,谢谢。 - Justin
@Justin 1. 你只需要在任何相关方法中设置断点(包括视图控制器和/或应用程序委托),并逐步执行它们。不,你不能从“故事板的开头”开始调试。2. 是的,有两个单独的问题:(a)在Xcode中编辑您的“child”源代码时公开可见的内容;以及(b)运行时会发生什么。它们是完全不同的东西。而且说实话,这很好。 “封装”是一个重要的OO设计概念,其中一个类的实现细节与另一个类(甚至子类)隔离开来。 - Rob
非常感谢您的及时回复和清晰的解释。我想为您的答案投票,但由于我是新成员,没有这样的权利。--Justin。 - Justin
没问题。顺便说一下,那个项目好像缺少Deck类。这可能吗?所以,我无法进行真正的测试。但是我可以看到那些控制器类在做什么。坦白地说,这让我觉得有点牵强附会(可能是课程的一部分,确保您理解子类可以覆盖超类的方法)。除非您有一堆不同的视图控制器共享某些常见功能,并且只想为每个更改一些细节,否则通常不会这样做。但我知道他们想做什么。 - Rob
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接