关于自定义 UIKit 对象的概念问题

Conceptual q about custom UIKit objects

简单问题:创建自定义版本的标准方法是什么,比如 UI 标签、UI 按钮等,以便我可以在多个地方轻松使用它?是否只是简单地扩展适当的 class:

import UIKit

class FormField: UITextField {

    override init()
    {
        super.init()

      //  borderStyle = UITextBorderStyle.None

    }
}

基本上只是想为某些 UI 对象设置一些默认值,以便在必要时我可以轻松地将它们放入界面中。不太确定如何让它工作。

UIView 及其子class 有两个指定的初始值设定项,-initWithFrame:-initWithCoder:。第一个用于编程实例化,而后者用于从 Storyboard 或 NIB 中解包的视图。因此,subclassing UIView subclasses 的常见模式如下(我使用的是 ObjC,但 Swift 代码应该很容易理解):

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if(self) {
        [self commonInit];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit {
    // Do your special setup here!
}

然后,如果您使用的是 Interface Builder 中的视图,请转到右侧辅助编辑器侧边栏上的标识选项卡,然后在顶部框中显示 UILabelUIButton,输入您的自定义按钮 class 名称。

希望这能让事情变得更清楚一些。

class 像 UILabel 这样的东西是非常罕见的。

最常见的方法是 HAS-A 模式,您可以让控制器(通常是 UIViewController)为您管理视图并重用它。或者,您可以制作一个 UIView 包含您要自定义的视图,并为您自定义它(传递需要传递的内容)。

您还可以拥有一个可以在现有标准视图上调用的 "configure my view this way" 函数。我在可重用代码中很少看到这种情况。我的经验是,这些配置函数是非常特定于应用程序的,但它们很常见。

UITextField 这样的东西已经有了委托方法,自定义它们的一种常见方法是创建一个应用某些行为的可重用委托。

这当然取决于您要实现的目标,但是 subclassing 在模式列表中排得很靠后,除非它是 class 明确设计和记录为subclassed(如 UIViewUIViewController)。