我熟悉MVC
的概念,其中我们将信息的建模,表示和处理的关注分开。但是当谈到现实生活中的例子时,它会变得朦胧。
让我们以苹果UITableView
为例。假设我们有一个相应的控制器来处理表格(提交的UIView
是自定义的,只有一个UITableView
,此时作为属性公开)。
UITableView
有一个属性backgroundView
,当没有要显示的元素时,我想用它来显示一些信息。真正的问题是它应该在哪里补充?
showEmptyTableInfoViewWithMessage:
)。UILabel
作为属性公开,并制作一个简单的隐藏/显示方法,并处理来自控制器的标签文本属性。UIView
,它将公开UILabel
。将其分配并将其分配给控制器中的backgroundView属性。UIView
具有UILabel
条件的backgroundView
并将其分配给{{1}}。由于所有这些例子都有效,我想知道哪一个是正确的方式(关注/维护方式的最佳分离)。我相信4号是最糟糕的,但这只是我现在的感觉。
提前感谢您提供有关最佳建筑设计/方法的任何信息。
答案 0 :(得分:0)
UIView
应负责隐藏或显示其子视图并管理其子视图。不应该对自身是否可见负责。这就是它暴露hidden
属性的原因 - 所以外人可以这样做。
我个人不喜欢你的四个选择。
我会选择其中一个:
backgroundView
已经有了一个视图对象。我们可以创建一个UILabel
对象,并将其作为子视图添加到表视图的默认backgroundView
中,并添加适当的自动布局约束。这可能最好通过继承UITableView
来完成,如果是这样,我不会公开UILabel
属性,而是公开一个NSString
属性,其setter只是设置标签的文本,并且其getter返回此文本。您可以使用其他一些方法来设置标签的字体和其他一些东西。创建UIView
的子类,可能称为UIBackgroundView
。这将是UIView
UILabel
(以及您想要的任何其他设置)。它不应该直接暴露标签,但是像以前一样,它应该公开属性,让你设置你可能想要设置的标签的东西,并通过代理进行。然后使用类似这样的工厂方法实例化它:
vwBackground = [UIBackgroundView backgroundViewWithText:@"Hello World];
然后简单地说:
tableview.backgroundView = vwBackground;
在您使用的两个选项之间取决于您想要的可重用性级别。
选项一可能稍好一些,并且在您创建子类后它会保存一些编码,但显然,您只能使用表视图执行此操作。如果您想对UICollectionView
或UIScrollView
或UIImageView
或您可以找到的具有backgroundView
属性的任何内容执行相同操作,则您需要为每个人创建类似的子类...但最后,我觉得它更容易使用,更直观。
但是使用选项2,您可以在任何地方自动使用UIBackgroundView
。它只是带有标签的UIView
,您可以使用任何其他UIView
对象执行任何操作。