【问题标题】:subclassing UIViewController in iOS在 iOS 中继承 UIViewController
【发布时间】:2013-08-03 03:19:06
【问题描述】:

我对在 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

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

ios如何从父属性'somecount'中获取值并设置子值?

谢谢。

【问题讨论】:

    标签: ios uiviewcontroller subclassing


    【解决方案1】:

    你问:

    ios如何从父属性somecount获取值并设置子值?

    子类总是继承其super 类的属性和方法。它们可能是也可能不是公共接口(您没有向我们展示somecount 的声明,所以我们不知道),但无论如何,它们都存在并且将在运行时解决(除非您覆盖这些方法/属性在child 中,您似乎没有这样做)。如果parent 中有私有方法和属性,您可能在编译时从child 看不到,但它们仍然存在并且在运行时会正常运行。

    所以,当带有集合视图的场景指定child作为集合视图的数据源时,如果child没有实现那些UICollectionViewDataSource方法,它会自动调用@ 987654331@。同样,当这些方法中的任何一个引用somecount 时,如果child 没有覆盖它,它将再次调用parent 的适当访问器方法。归根结底,child 自动继承了parent 的所有行为、方法和属性。

    【讨论】:

    • 谢谢 Rob,我尝试调试应用程序,它的第一行在父级中:@property (weak, nonatomic) IBOutlet UICollectionView *CollectionView;我认为它可以在 Parent 中为私有属性设置值的原因是因为情节提要知道 collectionView 是父类的出口。无论如何要调试情节提要上的代码,以便我可以弄清楚起点在哪里以及详细的步骤流程。谢谢。
    • 让我把我的问题说清楚:1.如何找出从应用程序开始调用的代码流,有什么方法可以从故事板一开始就进行调试?即初始化故事板——初始化集合视图——初始化集合视图的控制器——还是先初始化父? 2. 您提到“底线,子级自动继承父级的所有行为、方法和属性。”这是否意味着子类也将具有私有属性(在父类中声明)?但是孩子在编译时无法访问它们?为什么我不能访问自己的财产?
    • 这里是链接:stanford.edu/class/cs193p/cgi-bin/drupal/system/files/… 看看 CardGameViewController 和 PlayingCardGameViewController,谢谢
    • @Justin 1. 你真的只需要在你的任何相关方法(视图控制器和/或应用程序委托)中放置断点并单步执行它们。不,您不能从“故事板的最开始”本身进行调试。 2. 是的,有两个不同的问题:(a) 在 Xcode 中编辑 child 源代码时公开可见的内容; (b) 运行时发生的情况。他们是两个完全不同的东西。坦率地说,这很好。 “封装”是一个主要的 OO 设计概念,其中一个类的实现细节与另一个类(甚至子类)隔离。
    • 非常感谢您的及时回复和清晰的解释。我想投票给你的答案,但我没有权利这样做,因为我是这里的新成员。 --贾斯汀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多