Swift - 生成各种控件的工厂类(包含标签,按钮,输入框等)
在iOS开发中,页面里有时会大量的用到一些控件,如果要一个个单独创建再设置样式的话就显得很麻烦。我们可以创建一个生成各种控件的工厂类,这样在需要的时候调用下就可以了。
工厂类的使用:
下面以一个自定义的工厂类为例,其中提供了文本标签,按钮,文本输入框,分段单选控件的生成,效果图如下:
工厂类:ViewFactory.swift
import UIKit class ViewFactory { /** * 控件默认尺寸 */ class func getDefaultFrame() -> CGRect { let defaultFrame = CGRectMake(0, 0, 100, 30) return defaultFrame } class func createControl(type:String, title:[String], action:Selector, sender:AnyObject) -> UIView { switch(type) { case "label": return ViewFactory.createLabel(title[0]) case "button": return ViewFactory.createButton(title[0], action: action, sender: sender as! UIViewController) case "text": return ViewFactory.createTextField(title[0], action: action, sender: sender as! UITextFieldDelegate) case "segment": return ViewFactory.createSegment(title, action: action, sender: sender as! UIViewController) default: return ViewFactory.createLabel(title[0]) } } /** * 创建按钮控件 */ class func createButton(title:String, action:Selector, sender:UIViewController) -> UIButton { let button = UIButton(frame:ViewFactory.getDefaultFrame()) button.backgroundColor = UIColor.orangeColor() button.setTitle(title, forState:.Normal) button.titleLabel!.textColor = UIColor.whiteColor() button.titleLabel!.font = UIFont.systemFontOfSize(14) button.addTarget(sender, action:action, forControlEvents:.TouchUpInside) return button } /** * 创建文本输入框控件 */ class func createTextField(value:String, action:Selector, sender:UITextFieldDelegate) -> UITextField { let textField = UITextField(frame:ViewFactory.getDefaultFrame()) textField.backgroundColor = UIColor.clearColor() textField.textColor = UIColor.blackColor() textField.text = value textField.borderStyle = UITextBorderStyle.RoundedRect textField.adjustsFontSizeToFitWidth = true textField.delegate = sender return textField } /** * 创建分段单选控件 */ class func createSegment(items: [String], action:Selector, sender:UIViewController) ->UISegmentedControl { let segment = UISegmentedControl(items:items) segment.frame = ViewFactory.getDefaultFrame() //segment.segmentedControlStyle = UISegmentedControlStyle.Bordered segment.momentary = false segment.addTarget(sender, action:action, forControlEvents:.ValueChanged) return segment } /** * 创建文本标签控件 */ class func createLabel(title:String) -> UILabel { let label = UILabel() label.textColor = UIColor.blackColor(); label.backgroundColor = UIColor.whiteColor(); label.text = title; label.frame = ViewFactory.getDefaultFrame() label.font = UIFont(name: "HelveticaNeue-Bold", size: 16) return label } }
工厂类的使用:
import UIKit class ViewController: UIViewController,UITextFieldDelegate { var txtNum:UITextField! var segDimension:UISegmentedControl! var btn:UIButton! override func viewDidLoad() { super.viewDidLoad() setupControls() } func setupControls() { //创建文本标签 let labelNum = ViewFactory.createLabel("阈值:") labelNum.frame = CGRect(x: 20, y: 100, width: 60, height: 30) self.view.addSubview(labelNum) let labelDm = ViewFactory.createLabel("维度:") labelDm.frame = CGRect(x: 20, y: 200, width: 60, height: 30) self.view.addSubview(labelDm) //创建文本输入框 txtNum = ViewFactory.createTextField("", action: nil, sender:self) txtNum.frame = CGRect(x:80,y:100,width:200,height:30) txtNum.returnKeyType = UIReturnKeyType.Done self.view.addSubview(txtNum) //创建分段单选控件 segDimension = ViewFactory.createSegment(["3x3", "4x4", "5x5"], action:"dimensionChanged:", sender:self) segDimension.frame = CGRect(x:80,y: 200,width: 200,height: 30) self.view.addSubview(segDimension) segDimension.selectedSegmentIndex = 1 //创建按钮控件 btn = ViewFactory.createButton("确定", action: nil, sender: self) btn.frame.origin = CGPointMake(80, 300) self.view.addSubview(btn) } func textFieldShouldReturn(textField: UITextField) -> Bool { //收起键盘 txtNum.resignFirstResponder() //打印出文本框中的值 print(txtNum.text) return true } func dimensionChanged(sender:AnyObject) { print("dimensionChanged") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
我想问一下,在上面的setupControls方法中的textFiled调用方法的那一部分,sender赋值为self的时候报错,是为什么啊?