【问题标题】:providing common functionality for different viewcontrollers in objective c为目标 c 中的不同视图控制器提供通用功能
【发布时间】:2015-08-12 15:58:00
【问题描述】:

我有很多viewcontrollers,它们需要一些与导航相关的通用功能。

之前我创建了一个基类BaseViewController(扩展UIViewController),它具有所有通用功能(例如在viewDidLoad 上执行一些任务等),并且我所有的viewcontrollers 都扩展了BaseViewController

问题是我的一些viewcontroller 应该是UIViewController 和一些UITableViewController 的子类,所以我不能使用上述方法。

一种方法是为两者编写基类并复制代码。有没有更好的方法不重复代码。

【问题讨论】:

  • 您可以尝试创建 UIViewController 的类别,它也可以与 UITableviewController 作为 UIViewController 的子类一起使用。
  • 你应该用委托替换继承:sourcemaking.com/refactoring/…
  • 在超类模型中,我可以在 viewdidload 中执行viewcontroller 特定任务...等,而无需在子控制器中编写单行代码。使用类别可以吗?

标签: ios objective-c iphone


【解决方案1】:

虽然您可以通过使用委托或辅助对象来解决这个问题,但我会提出不使用 UITableViewController 的理由。它只是UIViewController 之上的一个非常轻量级的子类,提供表格视图,符合委托和数据源协议,并添加一两个属性用于选择和刷新。

虽然我通常不建议重新创建框架已经为您完成的某些内容,但如果您只保留从公共基类继承的所有内容并添加一个表,它可能(在您的情况下)使您的代码更易于理解查看子类之一。

如果您确实认为这是一种合理的方法,UITableViewController documentation 概述会详细说明这些行为的具体实施方式和位置,因此模仿其确切设置是微不足道的。

UIViewController添加表格视图

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@end

在您的故事板中,从对象库中拖出一个“表格视图”并将其放在文档大纲中视图控制器场景的“视图”之上 - 这会将根视图替换 UITableView.

然后把它挂起来:

  • ctrl-从视图控制器拖动到表视图以连接viewtableView 出口
  • ctrl - 从表视图拖到视图控制器以设置delegatedataSource 出口。

完成 - 无需魔法。

【讨论】:

  • 我也不希望重新创建框架已经完成的事情。这将需要大量工作并且容易出现错误。如何使用委托来做到这一点?不是每个控制器都需要实现委托吗?
  • @hridayesh 我的意思是 VC 可以将他们的共同行为委托给另一个对象,但这更加混乱。我真的建议将UITableViewController 删除为仅显示表格视图的UIViewController,因为您的VC 将更加清晰和可维护。我必须强调,我认为您期望的工作比实际需要的要多; UITableViewController 真的UIViewController 之上并没有做太多事情,这种类型的设置很常见。除了它提供的表格视图之外,您实际上需要 UITableViewController 的什么行为?
  • 在我的故事板中,我创建了UITableViewController 并链接到MyViewController,它扩展了UITableViewController。它只提供绘制单元格的基本行为和对它们的操作。如果MyViewController 不扩展UITableViewController,我如何链接它以提供基本行为?
  • 我已经更新了我的答案以描述如何将表格视图添加到 UIViewController 子类 - 这真的很简单,我会肯定推荐它而不是使继承层次结构复杂化.
  • 在我的故事板中,它是 UITableViewController,我将其类设置为 ViewController,它是 UIViewController 的子类并实现 UITableViewDelegate、UITableViewDataSource 协议。
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多