关于自定义 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 之类的东西已经有了委托方法,自定义它们的常用方法是创建一个可重用的委托来应用某些行为。

这当然取决于您要实现的目标,但子类化在模式列表中的位置非常靠后,除非它是一个明确设计并记录为子类化的类(如UIViewUIViewController)。

【讨论】:

你能详细说明“创建一个可重用的委托”吗?我认为代表只是协议,实际上并没有应用任何行为。在委托方面,我是个菜鸟,但我一直在看它的教程,我有点明白,但我不一定知道如何将它应用到重用 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 选项卡,然后在上面显示 UILabelUIButton 的框中输入您的自定义按钮类名。

希望这能把事情弄清楚一点。

【讨论】:

以上是关于关于自定义 UIKit 对象的概念 q的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 UIKit 事件从自定义 UIKit 控件公开到 SwiftUI

UIkit框架(14)自定义标签控制器

UIKit框架(10)自定义modal过渡效果

如何使用 Q_PROPERTY 公开自定义对象列表

在 iPad 上使用自定义背景图像创建 UIKit 弹出框

UIView 类别 - 自定义方法不返回 UIView