如何通过我的应用程序为所有不同的UITableView提供相同的外观?

时间:2011-09-05 12:28:50

标签: iphone ios uitableview

这应该是一个非常基本的问题,即使你可以链接到涵盖这个(或类似的)主题的某种文章/教程,我也会很高兴。

我有一个带有四个选项卡的应用程序,每个选项卡包含一个带有表视图的导航控制器。我使用UITableViewController子类,因为我希望在一些表格之上有一个静态视图,在一切表格下面有一个图像背景。我也使用不同类型的自定义单元格(大多数配置为-willDisplayCell中的图像和代码)。因为我想要所有表格的相同外观和感觉,我想知道如何重用一些代码,但我很难弄清楚这一点。我是否必须创建一个带有UIViewController插座的“基础”UITableView子类,然后将其用作我的超类?或者我是否必须在单独的类中实现我的UITableViewDelegate并使用该类的对象作为表视图委托?或者我应该使用自定义的UITableView和子类来代替吗?

如果需要,我可以提供更多细节,但我想这对于开始讨论已经足够了。谢谢你的帮助!

5 个答案:

答案 0 :(得分:6)

我会考虑继承UITableView并将dataSourcedelegate设置为self并在类中实现GUI逻辑,并创建一个自定义逻辑来获取数据(可能转发一些dataSource / control)将功能委托给您的一个VC。)

单元格的布局代码应该放在单元格逻辑中!您应该考虑为包含布局和逻辑的逻辑创建自定义UITableViewCell子类(可能还有它们的XIB)。重用。 (也许是一个dataObject属性,让单元格读取你的模型?!)。然后,您可以使用UITableView子类来创建和管理这些单元格(例如模型类和XIB名称之间的映射)

这可能是一种生成大量可重用代码的方法,您只需更改模型类或修改其布局,或子类化模型类或子类UITableViewCells等细节。

答案 1 :(得分:0)

一种可能的方法是创建一个继承UITableView的自定义视图。覆盖initWith - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style并设置要在表中使用的GUI。

现在,您可以在应用程序中的任何位置使用此类。

现在,当您使用不同的单元格模式时,建议您为每个单元格创建一个类,在您内部,cellForRowAtIndexPath根据某些标志或数据结构创建不同单元格的对象。阅读工厂设计模式,深入理解这一概念。

基本流程将是这样的。

  1. 分配新的自定义表格。
  2. 将数据源和委托分配给同一个表类OR或保存表的类。
  3. 在表格中加载数据。 - >在这里加载数据时可以找出正在使用的数据类型。基于数据制作相对单元格的对象。
  4. 这将使所有单元格和表格在整个应用程序中可重复使用。

    有关Decorator设计模式的更多详细信息。

    如果需要详细信息,请发布。

答案 2 :(得分:0)

我确实说最好的办法是从UITabBarController继承你的MasterController

在此MasterController viewDidLoadviewWillLoad中,您可以编写将在您的子类稍后使用的常见布局和设置。

这也更方便,因为您可以在MasterController实施方法中相应地刷新视图。

通过此MasterController加载一个基本NIB文件也可能很好,并且可以在子控制器中完成自定义布局(例如在initWithNibName:bundle:方法中。

我认为创建UITableView的子类并不是一个好主意,因为您不是自定义Table View的行为,而是自定义使用它的控制器。

希望这有帮助。

编辑:NIB方式
如果你决定使用NIB文件,你可以继续使用一个MasterController,如下所示。

  1. 在你的MasterController中创建必要的插座(我想在这里 你只需要TableView但它可能更复杂)
  2. 在InterfaceBuilder中设置连接,就像通常那样
  3. 在您创建UITabViewController的代码中,您将使用 [[YourTabBarController alloc] initWithNibName:@"YourMasterNIBFile.xib" bundle:nil]
  4. 由于这些商店会被继承,因此您继承YourTabBarController的商品YourTabBarController将拥有正确构建视图所需的所有信息。

    我希望这很清楚,我已经将这个方法用于我的一个应用程序,并且构建MasterController所花费的时间绝对值得为它提供的所有灵活性带来痛苦。

答案 3 :(得分:0)

我这样做是通过创建一个基类(uiviewcontroller或uitableviewcontroller),并使用Type的新init方法。例如,如果您在代码(非笔尖)

中创建它
  • (ID)initWithType:(NSInteger的)tabtype;

使这个基类也成为您的委托/数据源,并实现所有必需的方法。 根据viewcontroller实例化的选项卡,调整数据源方法 - 设置要显示的不同数据。在您的视图控制器中,委托方法可能仍然相同,因此没有任何更改。

我通常在代码中执行UI操作,因此您可以使用带有tableView子视图的viewcontroller进行静态视图,或者您也可以将静态视图放在UITableView之上,方法是将其添加到tableView作为子视图,然后覆盖layoutSubviews以调整y坐标使其看起来像是静态的。 (WWDC2011会议高级Scrollview技术显示了如何执行此操作)。

如果您正在使用NIB,那么您必须使用initWithNib,那么最简单的方法是将基类再次子类化为每个选项卡的4种不同情况。

现在因为你的代码被分解为基类,如果你想进行更改,那么它只能改变一个类。

答案 4 :(得分:-2)

出于兴趣,您为什么要在tableview单元格之上设置静态视图?

您可以使用UITableViewController在tableview单元格后面显示背景图片。