ios - 使用 Swift 的 iOS 代码结构,所有代码放在哪里?

标签 ios swift model-view-controller

所以我是 iOS 的新手,但对 Android 已经很熟悉了,我开始了解大多数东西的要点,但我很难理解发生了什么,为什么会这样......

当你只使用 Storyboard时,很容易实现 MVC 模式(或任何其他 View 分离模式),但当你在代码中制作所有内容时,我觉得它变得有点困惑。

假设我有一个 ViewController,其父 View 包含 subview ,而 subview 又可能包含 subview 。现在我应该在哪里创建 child ?在 ViewController 中(最方便)还是在父 View 中(最近)?

如果我使用我有引用的 ViewController,我将很容易制作 outlets 等。但是 ViewController 是否也应该做 setTitle、setImage、background 等事情?这绝对是最简单的解决方案。缺点是 View 只是简单的对象制作,这将导致 ViewController 变得臃肿。

如果我使用 View ,我将很难将 socket 返回到 ViewController,并且 ViewController 最终几乎什么都不做。

Apple 也没什么帮助,官方的 FoodTracker 教程显示了 ViewController 和 Views using outlets 等。

我现在的基本结构:

updateLayoutStates()
setupLayoutPositions()
updateLayoutPositions()

...

/// Setups the initial constraints for all views
func setupLayoutPositions() {

    // add views by order of appearances
    addSubview(languageBtn)
    addSubview(playBtn)
    addSubview(menuBtn)
    //addSubview(barScrollOverlayView)
    addSubview(barScrollView)
    addSubview(collapseBtn)

    // add bar scroll inner subviws by order of appearance
    barScrollView.addSubview(barScrollContentView)

    barScrollContentView.addSubview(speedContainerView)
    barScrollContentView.addSubview(speedProgress)
    barScrollContentView.addSubview(readingStratBtn)
    // More code that adds constraints etc. etc.

...

/**
 Updates all views based on the current status of the bar
 */
func updateLayoutStates() {
    print("Bar updateLayoutStates")

    // setup base layout
    // setup permanent items, listed by appearance
    languageBtn.backgroundColor = UIColorFromHex(Constants.Colors.dark_blue, alpha: 1)
    languageBtn.setTitle("lang_da".localized, forState: .Normal)
    languageBtn.postSetup()
    languageBtn.setTitleColor(UIColorFromHex(Constants.Colors.white, alpha: 1), forState: .Normal)

    playBtn.setImage(UIImage(named: "Play"), forState: .Normal)
    playBtn.setImage(UIImage(named: "PlayActive"), forState: .Highlighted)
    playBtn.setTitle("label_play_key".localized, forState: .Normal)
    playBtn.postSetup()

   ...

/// updates the positions of all layouts based on the current status of the bar
func updateLayoutPositions() {
    if currentBarState == BarState.EnabledStandardExpanded {
        self.removeConstraint(collapseLeftConstraint)
        self.addConstraint(collapseRightConstraint)
    } else if currentBarState == BarState.EnabledStandardCollapsed {
        self.removeConstraint(collapseRightConstraint)
        self.addConstraint(collapseLeftConstraint)
    }
}

非常感谢所有带示例的解释,如果我还不够清楚,我很乐意进一步解释。

最佳答案

一方面,您在谈论好的架构。另一方面,您需要有关特定 View 结构的帮助。

1) 对于第一部分,您有很多资源。 DJohnsen 已经提到了 MVVM 和 VIPER,我认为它们是 Google 的一个很好的搜索字符串。 我认为熟悉架构主题总是好的。每个架构都有权衡取舍。 Bob 大叔的“整洁代码”是一个很好的起点。

从那里发展出许多想法。

2)关于您的 View 问题:

如果您有嵌套的 View 层次结构,考虑 View Controller 包含 可能是个好主意。一旦您看到,您的 View 由许多其他 View 组成并且它变得更加复杂,您可能想要拆分组件。 您始终必须考虑要解决的具体问题:

  • 您只想显示一个标签和一个按钮吗?将它们直接添加到 View Controller 并连接 socket 或设置目标/操作。

  • 您是否有包含标题、自定义 subview ,也许还有 tableView 等的复杂 View ?使用 subview Controller

但要分解它:

View Controller 和 View 彼此非常接近。 在 iOS 中,我开始以下列方式处理 View 和 View Controller :

  • View Controller 应该是哑的。它们的唯一目的是管理子 Controller 或设置一些 View 的属性。 View Controller 还管理高级屏幕处理(设备旋转、状态栏处理等)并与表示层对话。

  • View 更笨,应该只设置 subview 、布局(设置布局约束)并提供一些自定义方法(可由 View Controller 使用)。

这听起来有点难:但我认为这对初学者来说是一个很好的指南。一段时间后,您会感到舒服。

你问的问题很好,但过一段时间你会自己回答。我认为最重要的是你应该只将特定于 View 的代码放入 View Controller 和 View 中。不多了。

所有其他的很快就会升级为宗教 war :)

干杯
奥兰多 🍻

关于ios - 使用 Swift 的 iOS 代码结构,所有代码放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37545818/

相关文章:

iphone - 使用 Core Data 和 Magical Record 创建实例变量

ios - 在 UINavigationController 中嵌入 Material CardTableView

swift - 动画期间的 CALayer 使用默认属性值而不是当前实例的属性值

ios - Xcode 一直显示 :-1: SWIFT_VERSION '5.0' is unsupported, 支持的版本是 : 3. 0、4.0、4.2。有什么解决方案吗?

javascript - 过滤任务不起作用 - 使用 es6 类的具有 MVC 模式的待办事项列表

ios - userInterfaceIdiom 始终表示 iPhone

ios - iOS swift 应用程序启动时出现黑屏

ios - swift 中的自定义 UIBezierPath(Arc 麻烦)

java - 困惑 : Role of Beans in JSF2 in comparison to classical MVC Controllers

c# - 从 Controller 实例化 IRepository 类的正确方法是什么?