ios - 为 UIViewController 中的 UIView 创建 Controller

标签 ios swift inheritance controller composition

在 iOS 世界中,我们都习惯了以下模式:

class UIViewController {

    open var view: UIView!
}

一个ViewController显然是一个控制view的controller,它包含了很多subview

现在,我有很多 subviews 我想重用,我想用更多的功能来丰富它们。考虑一个 UISlider、一个 UILabel 或一个 UITableView,它们对某些事件或模型中的某些更改使用react。这些 subview 还需要具有 IBInspectable 属性的 @IBDesignable 用于自定义目的。我也想通过库共享这些组件。

所以在某种程度上,我希望小型 Controller 控制那些最终将出现在 ViewControllerview 中的 subviews

我正在考虑为 UIKit 类做这个:

@IBDesignable
public class CustomSlider: UISlider {

}

这是一种能够为组件提供自定义选项的好方法。缺点是我们在这里使用继承(宁愿使用组合),我不确定 CustomSlider 是否真的被认为是一个 Controller 。

谁能告诉我为可定制的 subview 创建 Controller 的最佳做法是什么?提前致谢!

编辑:具有委托(delegate)和数据源的 View 的特定情况:

@objc public class CustomTableView: UITableView, UITableViewDataSource, UITableViewDelegate {

    @IBInspectable public var someCustomField: UInt = 0

    public override init(frame: CGRect, style: UITableViewStyle) {
        super.init(frame: frame, style: style)
        dataSource = self
        delegate = self
    }

    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        dataSource = self
        delegate = self
    }

    // Implement UITableViewDataSource and UITableViewDelegate
}

datasource = selfdelegate = self 是不好的模式吗?

最佳答案

这是一个判断电话。我会说,如果您所做的只是向单个 View 类添加功能,那么最好只使用自定义子类,例如您的 CustomSlider 示例。

另一方面,如果您正在使用小型对象套件,例如 slider 、文本字段、分段控件和几个标签,您可能需要考虑使用容器 View 、嵌入转场和自定义 View Controller 。将其视为设置管理 UI 元素集的磁贴。您可以将这样的 View Controller 放在任何您想要的地方,并根据需要调整它的大小。

您还可以创建一个自定义 Controller 对象来管理一个或多个自定义 View ,但是并没有真正的系统“管道”,因此构建支持该方法的机制的负担落在您身上。您必须教会您的 View Controller 与不是 View 但内部有 View 的 Controller 对象对话。

Apple 在几个实例中做了您所说的事情:UITableViewControllerUICollectionViewController,我认为他们没有做对。 UITableViewControllerUICollectionViewController 可以管理单个 View 。您不能在底部放置按钮,或在某处放置标签,或分段控件。其中一个专用 View Controller 的内容 View 必须相应的 View 对象,这限制了它们的用途。当然,您可以通过使用容器 View 和嵌入 segues 来解决这个问题,这引出了我的建议。

编辑:

至于使 View 对象成为它自己的数据源,我称之为“违反权力分立”。 TableView 是 View 对象,数据源是模型对象。通过组合它们,您将 View 和模型合二为一。这将创建一个更大、非常专业的对象,不太可能被重用。

使对象成为它自己的委托(delegate)也是如此。委托(delegate)模式的思想是能够将有关对象行为的某些决定留给其他人,从而使其更加灵活。通过将其设为自己的委托(delegate),您可以限制 TableView 的行为范围并降低其可重用性。

这两种方法都不会“扭曲你的思想,弯曲你的脊椎,让敌人赢得 war ”,但它们似乎是不明智的。

关于ios - 为 UIViewController 中的 UIView 创建 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460795/

相关文章:

C# 抽象类继承

multithreading - iPhone : address book is erased sometimes

iphone - 重新加载数据时 tableView 会崩溃

ios - 我可以通过编程方式选择分层 UITableView 结构中的详细信息页面吗?

ios - ASWebAuthenticationSession:支持自己的提供者

swift - 删除单元格时的字典值 - 在展开可选值时意外发现 nil

ios - 创建 View Controller Storyboard与以编程方式创建 View Controller Storyboard - 性能

swift - Spritekit中扩展圆形抠图转场效果

C++ 抽象类型初始化

python - 为什么继承 'object' 的 python 类会在其 __init__ 方法中调用 'super'?