2015-04-01 69 views
0

简单问题:创建一个自定义版本的标准方法是什么?说一个UILabel,UIButton等,以便我可以在多个地方轻松使用它?难道仅仅是为了延长相应的类:关于自定义UIKit对象的概念q

import UIKit 

class FormField: UITextField { 

    override init() 
    { 
     super.init() 

     // borderStyle = UITextBorderStyle.None 

    } 
} 

基本上只是想获得一些UI设置一些默认值的对象,所以我可以轻松地将它们拖放到界面,如果必要。不确定如何让这个工作。

回答

2

子类化例如UILabel是非常罕见的。

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

您也可以使用“配置我的视图”方式来调用现有的标准视图。我没有经常在可重复使用的代码中看到这一点。我的经验是,这些配置函数是非常特定于应用程序的,但它们是合理的。

UITextField之类的东西已经有委托方法,并且定制它们的常用方法是创建一个应用某些行为的可重用委托。

这当然取决于你想要达到的目标,但是子类化在模式列表上还差得很远,除非它是明确设计并记录为子类的类(如UIViewUIViewController)。

+0

您可以详细说明“创建可重用代表”吗?我认为代表们只是协议,实际上并没有任何行为。当谈到代表团时,我是一个小菜鸟,但我一直在看教程,并且我得到它,但我不一定会看到如何应用它来重用UITextField。 – 2015-04-02 17:10:11

+0

委托是实现委托协议的对象。如果您想重复使用拒绝文本字段中的空格所需的代理代码,可以创建一个实现该代码的“TextFieldNoSpacesDelegate”对象。然后,你的'UIViewController'将创建其中的一个,并将其设置为所需文本字段的委托。 – 2015-04-02 17:24:45

1

UIView及其子类有两个指定的初始化子,-initWithFrame:-initWithCoder:。第一个用于编程实例化,而后者用于从Storyboard或NIB解压缩视图。正因为如此,对于子类UIView子类的常规模式下(我用ObjC但斯威夫特代码应该很容易弄清楚):

- (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! 
} 

然后,如果您使用的界面视图生成器,转到右侧助手编辑器侧栏上的“身份”选项卡,并在顶部框中显示UILabelUIButton,放入您的自定义按钮类名称。

希望这可以清理一些东西。