2017-04-25 60 views
0

我想练习使用没有故事板创建简单的应用程序。我能够以编程方式(缓慢)执行约束,但我也想练习将代码分离为MVC。有没有一个特定的地方/方法可以写出程序化的约束条件?或者没有关系?在哪里把MVC的编程约束

+1

例如,您可以将约束放在UIView(或UITableViewCell)的子类中,然后将该视图添加到您的UIViewController或在您的tableView中使用客户单元格。 – mat

+0

@mat,但是没有“最佳实践”或内置约束条件的方法? – RubberDucky4444

+1

我个人创建了一个名为'setupViews()'的方法,其中添加了所有子视图和约束,然后在init函数中调用该方法。我不确定这是否是最佳做法;) – mat

回答

1

在评论中很好的讨论。我的想法,基于这个讨论?

有了一种认识问题主观的,你把你的约束:

  • 在视图控制器的生命周期中最早他们在哪里工作。
  • 尽可能“接近”视图。
  • 如果这是常见的事情,尽可能通用。
  • 了解如何你的细节适合所有的东西。

(理解,问题不限于约束。它可以适用于层次结构,用户界面,甚至数据库表,当你下来吧!)

坚持限制,我的答案.. ...

(1)使用UIViewControllerUIView生命周期。

普遍认为生命周期是loadViewviewDidLoadviewWillAppearviewWillLayoutSubviewsviewDidLayoutSubviews,和viewDidAppeargreat SO answer detailing this.

相信loadView是限制为时尚早,但不viewDidLoad - **只要你不期待知道帧的大小。虽然很多人说viewDidLayoutSubviews是正确的地方,但我发现大部分时间都是如此。无论哪种方式,尽快设置您的约束!

(2)尽量接近视野。

如果您有子视图 - 我有一个“ToolBar”类对象 - 您希望至少尽可能地在该类中编码约束。例如,在我的工具栏中,它滑出,具有按钮,甚至可以根据方向旋转。 只有约束没有里面这些类是为方向 - 所有者是(我相信应该是)视图控制器实例化它。

(3)使其具有通用性。

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

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

这应该是显而易见的。如果您需要针对各种方向进行编码,请使用阵列并激活/停用它们。 (YES,一个常见的错误是替换它们!那是在和自己的一些重大难题。)

如果可以让事情变得活跃,声明约束,设置`isActive = true1,忘掉它。如果您需要调整该约束的常量或乘数,则在声明名称中,然后在需要修改的位置执行该操作。

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

1

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

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

我写了一些这样的应用程序。主要缺点是可能很难做出快速调整,而且您确实需要了解您可以使用的所有不同类型的约束条件。

Here's a pastebin我做这个时使用了一些扩展。我希望这有帮助。