1

我在 obj-c 中实现了以下类方案:A 类是 UIViewController 的子类。B 类和 C 类是 A 的子类。现在我需要创建一个 D 类,它必须是 A 的子类,但它包含一个 UItableView,因此它也需要 UITableViewController 功能。我的问题是,我该如何解决这个问题?这样做最优雅的方式是什么?我对如何做到这一点有一些想法:

1- 使 A 成为 UITableViewController 的子类,并在不使用 UItableViews 的类上重载 loadView 方法,以捕获当 se 尝试加载没有 UITableView 的 UITableViewController 时抛出的异常。(在我看来,这个解决方案更像是一个 hack,而不是一个解决方案!)

2- 保持一切不变,并在 D 中实现 UITableDelegate 和 UITableDataSource 协议。(在我看来,这个解决方案比第一个更优雅,但我显然是在重新实现 UITableViewController)。

3- 在 D 类中创建一个 UItableViewController 来代表 D 管理 tableView。

4- 使 D 成为 UITableViewcontroller 而不是 A 的子类,并在 D 中创建类型 A 的数据成员来管理 D 工作的 A 部分。

你认为最好的方法是什么?将 A 转换为协议不是一种选择。

谢谢你。

4

3 回答 3

2

UITableViewController课程为您做了一些事情:

  1. UITableView如果您没有以其他方式指定其视图(通过使用 XIB 或情节提要或通过重载loadView或直接分配给其view属性) ,它将创建 a作为其视图。自己很容易做到这一点。

  2. 当键盘出现时,它可以防止当前输入字段隐藏在键盘后面。你也可以自己做。这并不难。Apple 在iOS 的文本、Web 和编辑编程指南中的“移动位于键盘下的内容”中记录了该过程,并且这里也有许多关于堆栈溢出的问答。

  3. 它完成了 * UITableViewController 类参考 * 的“概述”部分中列出的其他一些附带的事情,所有这些对于你自己来说都是微不足道的。

  4. 如果您使用情节提要,它允许您在情节提要中定义静态表格视图单元格。这是UITableViewController我能想到的唯一一个你不能轻易复制到你自己的UIViewController子类中的特性。

如果您不需要#4,那么您应该使用您的解决方案#2(只需创建一个A子类)。

如果你需要#3,你可以使用你的解决方案#4。但是最好将该功能A分解到一个单独的辅助类Z中,并同时给出A一个类D的实例变量(或属性)Z

于 2013-08-16T06:36:27.267 回答
1

您不需要 UITableViewController 子类来处理 UITableView 的委托和数据源方法。您所要做的就是让您的类实现UITableViewDelegateUITableViewDataSource然后实现正确的方法(即 UITableViewController 将包含的方法)。

例如,您可以:

@interface D : A <UITableViewDelegate,UITableViewDataSource>

将您的 UIViewController 声明DA实现 UITableView 的数据源和委托的子类。

然后,当您在 D 类中创建 UITableView 时,请执行以下操作:

tableView.delegate = self;
tableView.dataSource = self;

完成此操作后,您所要做的就是在类中实现您需要的 dataSource 和委托方法,D并且您的 UITableView 将被填充。

例如,您可以:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.data count]; //self.data is an array the UITableView is populated from.
}

//...etc implement other methods.
于 2013-08-16T06:37:06.930 回答
0

问题不清楚。

如果 A 已经是一个 UIViewController 那么它有一个众所周知的属性(视图)指向它的唯一一个视图。如果 D 是 A 的子类,它可以只有一个视图。如果您描述的是这种情况,那么您对 ​​D 的要求是相互矛盾的。我想添加一个新的类 E 并让它聚合 A 和 D 会更好,但这只是基于关于您的实际要求的零信息的猜测.

Objective C 不是 C++,类的“D”部分可以拥有自己的“视图”成员。

于 2013-08-17T23:17:50.123 回答