2011-09-05 14 views
2

这应该是一个非常基本的问题,即使您可以链接到涵盖此(或类似)主题的某种文章/教程,我也会很高兴。如何通过我的应用程序对所有不同的UITableView进行相同的外观?

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

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

回答

6

我会考虑子类的UITableView并设置dataSourcedelegate自我和实现类里面GUI逻辑并让你的数据和退出(可能转发某些数据源/控制会议代表的功能,您的风险投资人之一创建自定义逻辑)。

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

这可能是一种生成大量可重用代码的方式,您只需更改详细信息,如添加模型类或修改它们的布局,或者继承模型类或子类UITableViewCells。

-2

出于兴趣,你为什么想要在tableview单元格上有一个静态视图?

你可以拥有的tableview细胞的UITableViewController后面的背景图像。

+0

,因为我不想让最顶层的视图与表格视图一起滚动。我想你应该添加一条评论来代替。 – phi

+0

我不认为你在这里给出的解释足以解释我认为从用户体验角度来看可能是一个有缺陷的想法。 – ader

+0

您的意见非常感谢,但我已经意识到我的决定对“用户体验”的影响。不管怎么说,还是要谢谢你。 – phi

0

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

现在,您可以在任何需要的地方使用这个类。

现在,当您使用不同的细胞模式将建议你做一个类为每个小区内,你的cellForRowAtIndexPath基于一些标志或数据结构,使不同细胞的对象。阅读Factory Design Pattern深入理解这个概念。

基本流程就是这样。

  1. 的Alloc新的自定义表。
  2. 将数据源和委托分配给相同的表类或包含该表的类。
  3. 在表中加载数据。 - >这里加载数据时会指出正在使用什么类型的数据。基于数据制作相对单元的对象。

这将使整个应用程序的所有单元格和表格可重复使用。

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

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

+0

因此,如果我继承UITableView,我该如何实现UITableViewDelegate协议? – phi

+0

@interface MyCustomTable:UITableView Mohammad

+0

@interface MyCustomTable:UITableView - >请注意,此代码演示如何在不使用XIB的情况下制作视图时在代码中实现任何委托。不要混淆你必须在继承UITableView的类中实现UITableViewDelegate。它可以在任何课堂上实施。如果UITableView子类,则在委托属性中分配实现UITableViewDelegate的类的引用。 – Mohammad

0

嗯,我确实会说最好的事情是从MasterController继承你的UITabBarController

在这里面MasterControllerviewDidLoadviewWillLoad你可以写出常用的布局和设置,以后你的子类会使用它。

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

它也可能是好的,有一个基本的护理文件加载槽此MasterController以及其自定义布局可在儿童控制器在initWithNibName:bundle:方法来完成(例如,

我想创造UITableView一个子类是不是因为你不是在自定义表视图本身的行为,但您自定义使用它,而不是控制器是一个好主意

希望这有助于

编辑。: NIB方式
如果您决定使用NIB文件,您仍然可以使用一个MasterController,方法如下。

  1. 在你MasterController创造必要的网点(在这里我想 你只需要TableView中,但它可以更配合物)
  2. 在InterfaceBuilder中设置你的连接,你通常会做
  3. 在你的代码时,创建UITabViewController是你将使用 的[[YourTabBarController alloc] initWithNibName:@"YourMasterNIBFile.xib" bundle:nil]

由于网点将被继承,你YourTabBarController类将继承YourTabBarController,将拥有正确构建视图的所有必要信息。

我希望这已经足够清晰了,我已经将这种方法用于我的一个应用程序,并且耗费了大量的时间来构建MasterController绝对值得它提供的所有灵活性所带来的痛苦。

+0

我同意我应该继承UIViewController。但在这种情况下,我可以为我的子类使用nib文件吗?我是否必须将超类的UITableView声明为出口,或者我真的搞错了? – phi

+0

不知道艾琳我认为你是正确的,但只是搞乱什么需要分类。我已经编辑了我的答案,以更详细地解释插座和笔尖文件。 – apouche

0

我通过创建一个基类(uiviewcontroller或uitableviewcontroller)并使用Type创建一个新的init方法来实现此目的。例如,如果您在代码中创建此代码(非笔尖)

  • (id)initWithType:(NSInteger)tabtype;

使这个基类也是你的委托/数据源,并实现所有必需的方法。 根据视图控制器实例化的标签,调整数据源方法 - 设置不同的数据以显示。代理方法在您的视图控制器中可能仍然相同,因此在那里没有任何变化。

我通常在代码中做UI的东西,所以你可以使用viewcontroller和tableView子视图来做静态视图,或者你也可以把静态视图放在UITableView之上,把它作为子视图添加到tableView中,然后重写layoutSubviews来调整y坐标使它看起来在一个点上是静态的。 (WWDC2011会议高级滚动视图技术显示如何做到这一点)。

如果您使用的是NIB,那么您必须使用initWithNib,那么最简单的方法是将基类再次划分为4个不同的情况。

现在,因为你的代码被分解到基类中,所以如果你想改变,那么它只有一个类需要改变。

相关问题