【问题标题】:Where to put programatic constraints for MVC在哪里放置 MVC 的编程约束
【发布时间】:2017-09-23 02:41:16
【问题描述】:

我想练习不使用情节提要创建简单的应用程序。我能够以编程方式(缓慢地)执行约束,但我也想练习将我的代码分离到 MVC 中。是否有我应该编写程序约束的特定位置/方法?还是没关系?

【问题讨论】:

  • 例如,您可以将约束放在 UIView(或 UITableViewCell)的子类中,然后将该视图添加到 UIViewController 或使用 tableView 中的客户单元格。
  • @mat 但没有“最佳实践”或内置方法应该放入约束?
  • 我个人创建了一个名为setupViews() 的方法,在其中添加所有子视图和约束,然后在init 函数中调用该方法。不过,我不确定这是最佳做法;)
  • MVC 是一个很好的起点,然后我切换到 VIPER,现在我练习面向对象的开发。不再有模型、线框或类似的东西。现在我只对对象进行编码(我只是说了吗?)。在那里查看我的评论:stackoverflow.com/a/43426337/6595536 也许这对你来说是一个想法。注意:约束是在我的 ViewRepresentation 对象中定义的。
  • 设置约束的适当位置是 UIViewController.updateViewConstrains 或 UIViewController.viewDidLoad,如果约束永远不会改变。

标签: ios swift model-view-controller


【解决方案1】:

在 cmets 中进行了很好的讨论。我的想法,基于那个讨论?

了解问题主观的,您可以设置约束:

  • 视图控制器生命周期中最早起作用的位置。
  • 尽可能“接近”视图。
  • 如果是通用的,请尽可能通用。
  • 了解您的细节如何融入一切。

(请理解,问题不限于约束。当您深入研究时,它可能适用于层次结构、UI,甚至数据库表!)

坚持约束,我的答案....

(1) 使用UIViewControllerUIView 生命周期。

一般视图生命周期为loadViewviewDidLoadviewWillAppearviewWillLayoutSubviewsviewDidLayoutSubviewsviewDidAppeargreat SO answer detailing this.

相信 loadView 对约束来说太早了,但viewDidLoad 不是 - **假设您不希望知道帧大小。虽然很多人说viewDidLayoutSubviews 是合适的地方,但我发现viewWillLayoutSubviews 在大多数情况下也同样有效。无论哪种方式,请尽快设置约束!

(2) 尽可能靠近视野。

如果你有子视图——我有一个“工具栏”类的对象——你希望约束,至少尽可能多地在类中编码。例如,在我的工具栏中,它会滑出,有按钮,甚至可以根据方向旋转。 insideonly 约束用于定向 - owner 是(并且我相信应该是)实例化它的视图控制器。 p>

(3) 使其具有普遍性。

我计划在几个应用程序中使用此工具栏。所以我做的第一件事就是将它添加到一个框架中。这个框架是必要的,因为我有一个应用程序,我提供了一个照片编辑扩展 - “编辑”屏幕尽可能地相同。最后,我将所有我的约束移到那里。 (至少尽可能多。)任何我认为可以重复使用的东西。

(4) 了解您的应用的具体要求。

这应该是显而易见的。如果您需要针对各种方向进行编码,请使用数组并激活/停用它们。 (是的,一个常见的错误是更换它们!这让你自己很头疼。)

如果您可以保持活动状态,请声明约束,设置 `isActive = true1,然后忘记它。如果您需要调整该约束的常数或乘数,请在声明 name 中,然后在需要更改它的地方进行。

我的结论?自动布局是一个非常有用的工具——在代码中更是如此。但是代码的放置就像问“如何编写用于汽车租赁的 OOP 应用程序”或“如何设计用于汽车租赁的数据库”。它不仅仅是一门艺术,还有很多答案。这些是我试图遵循的“规则”——YMMV。

【讨论】:

    【解决方案2】:

    要开始使用这种开发风格,我建议查看 Let's Build That App,因为他通过非常深入的示例完全用代码设置复杂的应用程序,没有故事板。

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

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

    Here's a pastebin 我在执行此操作时使用的一些扩展。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2011-07-03
      • 2011-06-03
      • 2012-08-20
      • 1970-01-01
      • 2017-12-17
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多