关于自定义 UIKit 对象的概念 q
Posted
技术标签:
【中文标题】关于自定义 UIKit 对象的概念 q【英文标题】:Conceptual q about custom UIKit objects 【发布时间】:2015-04-01 23:12:27 【问题描述】:简单的问题:创建自定义版本的标准方法是什么,比如 UILabel、UIButton 等,以便我可以在多个地方轻松使用它?是不是简单地扩展了相应的类:
import UIKit
class FormField: UITextField
override init()
super.init()
// borderStyle = UITextBorderStyle.None
基本上只是想为一些 UI 对象设置一些默认值,这样我就可以在必要时轻松地将它们放入界面中。不太确定如何使其正常工作。
【问题讨论】:
【参考方案1】:像UILabel
这样的子类是非常罕见的。
最常见的方法是 HAS-A 模式,您可以让控制器(通常是 UIViewController
)为您管理视图,然后您可以重用它。或者,您可以创建一个UIView
,其中包含您要自定义的视图,并为您自定义(传递需要传递的内容)。
您还可以在现有标准视图上调用“以这种方式配置我的视图”功能。我在可重用代码中没有经常看到这种情况。我的经验是,这些配置功能被证明是非常特定于应用程序的,但它们很常见。
UITextField
之类的东西已经有了委托方法,自定义它们的常用方法是创建一个可重用的委托来应用某些行为。
这当然取决于您要实现的目标,但子类化在模式列表中的位置非常靠后,除非它是一个明确设计并记录为子类化的类(如UIView
或UIViewController
)。
【讨论】:
你能详细说明“创建一个可重用的委托”吗?我认为代表只是协议,实际上并没有应用任何行为。在委托方面,我是个菜鸟,但我一直在看它的教程,我有点明白,但我不一定知道如何将它应用到重用 UITextField。 委托是实现委托协议的对象。如果您想重用拒绝文本字段中的空格所需的委托代码,您可以创建一个实现该功能的TextFieldNoSpacesDelegate
对象。然后您的 UIViewController
将创建其中之一,并将其设置为所需文本字段的委托。【参考方案2】:
UIView
及其子类有两个指定的初始化器,-initWithFrame:
和 -initWithCoder:
。第一个用于程序化实例化,而后者用于从 Storyboard 或 NIB 中解压缩的视图。因此,子类化UIView
子类的常见模式如下(我使用的是 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 中的视图,请转到右侧助手编辑器侧边栏上的 Identity 选项卡,然后在上面显示 UILabel
或 UIButton
的框中输入您的自定义按钮类名。
希望这能把事情弄清楚一点。
【讨论】:
以上是关于关于自定义 UIKit 对象的概念 q的主要内容,如果未能解决你的问题,请参考以下文章