编写UIViews以创建复杂视图的最佳方法?

Yug*_*dle 9 cocoa-touch uiviewcontroller uiview ios

从Web堆栈过渡iOS仙境,我发现很难理解如何重新构建我对MVC的想法并在iOS上有效地构建我的UI.

前提:

  • 在Web堆栈中:
    • 控制器通常对应于URL,视图表示页面.
    • 视图有方法不使用CSS + Javascript +片段重复代码.
  • 在iOS中:
    • 一旦进入对应于UIViewController的新屏幕.
    • 我们有一个UIView组成自己的UIViews
    • UIViews与UIViews,UIViewController与UIViews,UIViewController与内联UIViews一起存在
    • 我们肯定会将重型或数据逻辑委托给最近的控制器
    • 感觉大多数在iOS中首先看起来很棒

题:

考虑为我创建视图的最佳方法是什么self.view:

  • 作为UIView类的视图
  • UIViewController与关联UIView类一样发生的视图.
  • UIViewController与内联一样发生的视图UIView

示例视图层次结构

------------------------------
|             A              |
|                            |
|    --------------------    |
|    |        B         |    |
|    |                  |    |
|    |  --------------  |    |
|    |  |     C      |  |    |
|    |  |            |  |    |
|    |  |            |  |    |
|    |  |            |  |    |
|    |  |            |  |    |
|    |  |            |  |    |
|    |  |            |  |    |
|    |  --------------  |    |
|    |                  |    |
|    --------------------    |
|                            |
------------------------------
Run Code Online (Sandbox Code Playgroud)

[细节具体]我〜不舒服〜经历:

  • A可能[self addView:B_view](如果B只是UIView)
  • A也可能[self addView:B_viewController.view](如果B有一个视图控制器)
  • A 也可能 [B setChildView:C_view]
  • 我们可以拥有B_viewController.delegate = A&C_viewController.delegate = A
  • 我们可以拥有B_viewController.delegate = A&C_view.delegate = B
  • 在所有这些案例共存后,我们必须考虑范围
  • 我看到C通过长代表链回答了C的问题.

逻辑分散在委托,viewControllers和视图中.

分离问题 - 但如何?

除了可以改善以上经验的"抽象井和关注点分离"这一论点.我相信它的viewController和viewController.view的流失很容易导致广泛的耦合.

这很快变得令人困惑,感觉就像意大利面条,尽管付出了努力但很难控制.

那说,

  • 解决上述陷阱的最佳做法是什么?
  • 什么是绝对不应该做什么?
  • 当代理人有效地说你可以更好地处理这个问题时,我们如何避免长代表链?

Aru*_*nan 3

也许,您正在处理的是 MVC - 大规模视图控制器的困境。这是一篇有趣的读物,其中 Marcus 谈到通过将代码放在其所属的位置(网络层、持久层或表示层(理想情况下是视图控制器))来有效地管理代码。

http://www.cimgf.com/2015/09/21/massive-view-controllers/

除了委托模式之外,我们还有基于块/闭包的方法,可能有助于清理代码。

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

总的来说,Robert C. Martin 的简洁代码方法在这里可能会有所帮助。通过称为 VIPER 架构的方式来实现它。这是有关该内容的教程。

https://www.objc.io/issues/13-architecture/viper/

Objective C 作为一种包含委托模式的语言,使用它来解决大多数问题是一种标准做法。

欢迎来到 iOS 平台。