在MVC中放置编程约束的位置在哪里?

3

我想练习使用无storyboard的方式创建简单应用程序。我能够通过编程实现约束(但速度较慢),但我也想练习将我的代码按MVC模式分离开来。是否有特定的地方/方法,我应该编写程序化约束?或者这并不重要吗?


1
例如,您可以将约束放在UIView(或UITableViewCell)的子类中,然后将该视图添加到您的UIViewController中,或者在tableView中使用自定义单元格。 - Mat
@mat 但是并没有“最佳实践”或内置方法来规定应该放置约束条件? - RubberDucky4444
1
我个人创建了一个名为 setupViews() 的方法,在其中添加所有的子视图和约束,然后在 init 函数中调用该方法。虽然我不确定这是否是最佳实践 ;) - Mat
1
MVC是一个很好的起点,然后我转向了VIPER,现在我正在进行面向对象开发的实践。不再有模型、线框之类的东西了。现在我只编写对象(我说“只”了吗?)。请看我的注释:http://stackoverflow.com/a/43426337/6595536也许这可以给你提供一些想法。注意:我的ViewRepresentation对象中定义了约束条件。 - ObjectAlchemist
设置约束的适当位置是在UIViewController.updateViewConstrains中,或者在UIViewController.viewDidLoad中,如果约束永远不会改变。 - vojer
2个回答

1

评论区讨论得很好。基于那个讨论,我的想法是?

在理解问题具有主观性的前提下,你会设置约束:

  • 它们在视图控制器生命周期中尽可能早地起作用。
  • 尽可能“靠近”视图。
  • 如果这是一些共同的东西,尽可能普适化。
  • 了解如何让你的特定内容适应所有内容。

(请注意,问题并不仅限于约束。实际上,当你深入研究时,它还可以应用于层次结构、UI甚至数据库表!)

遵循约束,这是我的答案...

(1)使用UIViewControllerUIView生命周期。

通常,视图生命周期是loadViewviewDidLoadviewWillAppearviewWillLayoutSubviewsviewDidLayoutSubviewsviewDidAppear这里有一个很好的SO答案详细介绍这些。

我认为loadView太早设置约束了,但viewDidLoad不会——前提是您不希望知道框架大小。虽然很多人说viewDidLayoutSubviews是正确的地方,但我发现viewWillLayoutSubviews大多数情况下同样有效。无论哪种方式,尽快设置约束!
(2)尽可能靠近视图。
如果您有子视图——我有一个名为“ToolBar”的对象类——您希望将约束尽可能编码在类内部。例如,在我的工具栏中,它会滑出、有按钮,甚至在方向变化时还会旋转。唯一不在这些类内部的约束是用于方向的——它的所有者(我认为应该是)实例化它的视图控制器。
(3)使其通用。
我计划在几个应用程序中使用此工具栏。所以我做的第一件事就是将其添加到框架中。需要这个框架是因为我有一个应用程序交付了一个照片编辑扩展 - 并且“编辑”屏幕尽可能相同。最终,我将所有的约束都移到那里。(至少尽可能地移动)。任何我认为可以重复使用的内容。 (4)了解您的应用程序的特定要求。 这应该是显而易见的。如果您需要为各种方向编码,请使用数组并激活/停用它们。(是的,常见错误是替换它们!这会给自己带来一些头疼问题。) 如果您可以保持活动状态,请声明约束,设置`isActive=true`,然后忘记它。如果您需要调整该约束的常量或乘数,在声明名称时进行设置,然后在需要更改它的位置进行更改。
我的结论?自动布局是一个非常有用的工具 - 在编程中更是如此。但代码的放置就像问“如何为汽车租赁编写面向对象的应用程序”或“如何设计汽车租赁的数据库”。这不仅是一门艺术,还有很多答案。这些是我尝试遵循的“规则” - 你的情况可能有所不同。

1

要开始这种类型的开发,我建议查看 Let's Build That App,他深入地介绍了如何在代码中完全设置复杂应用程序,而不使用storyboards。

他构造约束的方式是使用 UIView 的自定义实现,这样您的视图代码就与 ViewController 分离。然后,在 viewDidLoad 方法中,您可以使用类似 self.view = MyView() 的方法来实例化您的 UIView 实现。

我写了几个这样的应用程序。主要缺点是很难进行快速调整,您真的需要学习所有可以使用的不同类型的约束。

这里有一个pastebin,其中包含我在这方面使用的一些扩展。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接