关于自定义UIKit对象的概念q

时间:2015-04-01 23:12:27

标签: ios xcode swift uikit

简单的问题:创建UILabel,UIButton等定制版本的标准方法是什么,以便我可以在多个地方轻松使用它?是否只是扩展适当的类:

import UIKit

class FormField: UITextField {

    override init()
    {
        super.init()

      //  borderStyle = UITextBorderStyle.None

    }
}

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

2 个答案:

答案 0 :(得分:2)

很少像UILabel这样的子类。

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

您还可以使用“以这种方式配置我的视图”功能,您可以在现有标准视图上调用该功能。我在可重用的代码中经常没有看到这个。我的经验是,这些配置功能非常适合应用,但它们是合理的共同点。

UITextField这样的事情已经有了委托方法,而定制它们的一种常用方法是创建一个可重用的委托来应用某些行为。

当然,这取决于你想要实现的目标,但是子类化在模式列表中相当远,除非它是一个明确设计并记录为子类的类(如UIView或{{1 }})。

答案 1 :(得分:1)

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中的视图,请转到右侧助手编辑器侧栏上的“身份”标签,并在顶部框中显示UILabel或{{1放入自定义按钮类名。

希望这可以解决一些问题。