如何将 UITableViewController 创建为可重用模块?

Posted

技术标签:

【中文标题】如何将 UITableViewController 创建为可重用模块?【英文标题】:How to create UITableViewController as reusable module? 【发布时间】:2013-12-11 12:24:36 【问题描述】:

我是 ios 开发新手。我创建了两个类UITableViewController。一个是Tasks 的列表,第二个是Notes 的列表。

现在的问题是这两个UITableViewController 在许多屏幕上都需要(在某些屏幕上同时)。我不想在每个屏幕上为UITableView delegates and datasource 重写所有代码。我想通过某种继承机制或模块系统重新使用UITableViewController

因此,在我需要显示列表的每个UIViewController 上,我只需在 nib 文件中添加一个UITableView,设置其自定义类,它应该开始显示数据。

是否可以使用某种继承、组件或模块系统?

感谢任何帮助。

【问题讨论】:

感谢您的回复,我已经创建了一个单独的 UITableViewController,并实现了所有必需的委托和数据源方法。现在我想在多个屏幕上使用这个 UITableViewController。任务和笔记是完全不同的东西。你可以忘记他们。问题是如何在多个屏幕上重用 UITableViewController。 【参考方案1】:

创建 UITableViewController 的子类,添加所有必需的委托方法并在 .h 文件中添加:

@property(nonatomic, strong) NSArray *myData;

所有方法都基于该数组设置,例如:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return self.myData;

当您想使用它时,只需创建对象并传递您的数据:

MYTable *tableViewController = [[MYTable alloc] init];
tableViewController.myData = DATA YOU WANT TO DISPLAY;

它会起作用,但您必须将完全相同的数据结构传递给您的 NSArray 才能在 cellForRowAtIndexPath: 方法中正确处理它。

【讨论】:

感谢您的回复。我仍然很困惑。我创建了运行良好的 TaskViewController。现在我想在我的实际屏幕 DashboardViewController 中使用它。那么我应该如何在 DashboardViewController 中使用 TaskViewController?如果我做 TaskViewController *taskVC = [[TaskViewController alloc] init]; [taskVC.tableView reloadData];它不起作用。目前我已经在 TaskViewController 中对 dataArray 进行了硬编码。 不要对 dataArray 进行硬编码,使用我在帖子中放置的属性,创建后添加:taskVC.dataArray = 要显示的数组。 谢谢 Greg,数据对我来说没问题。它已在 TaskViewController 中设置,您可以假设我需要在所有屏幕中显示硬编码数据。因此我在TaskViewController 中创建了数据。因此无需在所有其他屏幕中一次又一次地设置。其实我正在考虑MVC模式。我想创建一个视图控制器。我可以在我想要的任何屏幕上使用。就像一个组件或插件。【参考方案2】:

嘿,伙计,您需要维护两个数组并创建一个切换按钮 ex。 a/b

如果按下 a 则获取一个数组的计数,如果按下 b 则计数另一个字典的数组。并通过维护一个 BOOL 变量来做到这一点。

例如。 BOOL 校验值;

-(UIButton *)a:(id)button

     checkvalue = TRUE;
     [tableview reloadData];

-(UIButton *)b:(id)button

     checkvalue = FALSE;
     [tableview reloadData];

现在将条件放在tableview中计算行数,以及cellforrowatindexpath方法。 像, // 对于 numberOfRowsInTableview

if(checkvalue == TRUE)

return [arr1 count];

else

return [arr2 count];

同样对于 cellForRowAtIndexPath 谢谢,祝您有愉快的一天。

【讨论】:

以上是关于如何将 UITableViewController 创建为可重用模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UITableViewController 创建为可重用模块?

如何将单元格插入 UITableViewController

如何将数据从 uitableviewcontroller 发送到 uitableviewcell

如何将数据放在 UITableViewController 的正确部分?

如何将 UITableView 或 UITableViewController 集成到 UIPageViewController 中?

如何将 segmentedControl 和 UISearchController 作为 UITableViewController 标头? (以编程方式)