I have written code below that programmatically creates multiple UIButton
that are placed on different UIView
. All buttons are similar and different by button title. The code does accomplish what it needs to do, but as you can see, the code is rather verbose, it's too lengthy.
Question
How can I structure the code below and make it compact and succinct?
Code
let myButton0 = UIButton(type: UIButtonType.Custom)
myButton0.setTitle("Text 0", forState:.Normal)
myButton0.titleLabel!.font = UIFont.systemFontOfSize(12)
myButton0.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton0.backgroundColor = UIColor.darkGrayColor()
myButton0.frame = CGRectMake(0, 0, 200, 100)
myButton0.alpha = 1
myButton0.showsTouchWhenHighlighted = false
myButton0.adjustsImageWhenHighlighted = false
myButton0.addTarget(self, action: #selector(ViewController.goDoThis0), forControlEvents:.TouchUpInside)
myView0.addSubview(myButton0)
let myButton1 = UIButton(type: UIButtonType.Custom)
myButton1.setTitle("Text 1", forState:.Normal)
myButton1.titleLabel!.font = UIFont.systemFontOfSize(12)
myButton1.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton1.backgroundColor = UIColor.darkGrayColor()
myButton1.frame = CGRectMake(0, 0, 200, 100)
myButton1.alpha = 1
myButton1.showsTouchWhenHighlighted = false
myButton1.adjustsImageWhenHighlighted = false
myButton1.addTarget(self, action: #selector(ViewController.goDoThis1), forControlEvents:.TouchUpInside)
myView1.addSubview(myButton1)
let myButton2 = UIButton(type: UIButtonType.Custom)
myButton2.setTitle("Text 2", forState:.Normal)
myButton2.titleLabel!.font = UIFont.systemFontOfSize(12)
myButton2.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton2.backgroundColor = UIColor.darkGrayColor()
myButton2.frame = CGRectMake(0, 0, 200, 100)
myButton2.alpha = 1
myButton2.showsTouchWhenHighlighted = false
myButton2.adjustsImageWhenHighlighted = false
myButton2.addTarget(self, action: #selector(ViewController.goDoThis2), forControlEvents:.TouchUpInside)
myView2.addSubview(myButton2)
let myButton3 = UIButton(type: UIButtonType.Custom)
myButton3.setTitle("Text 3", forState:.Normal)
myButton3.titleLabel!.font = UIFont.systemFontOfSize(12)
myButton3.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton3.backgroundColor = UIColor.darkGrayColor()
myButton3.frame = CGRectMake(0, 0, 200, 100)
myButton3.alpha = 1
myButton3.showsTouchWhenHighlighted = false
myButton3.adjustsImageWhenHighlighted = false
myButton3.addTarget(self, action: #selector(ViewController.goDoThis3), forControlEvents:.TouchUpInside)
myView3.addSubview(myButton3)
let myButton4 = UIButton(type: UIButtonType.Custom)
myButton4.setTitle("Text 4", forState:.Normal)
myButton4.titleLabel!.font = UIFont.systemFontOfSize(12)
myButton4.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton4.backgroundColor = UIColor.darkGrayColor()
myButton4.frame = CGRectMake(0, 0, 200, 100)
myButton4.alpha = 1
myButton4.showsTouchWhenHighlighted = false
myButton4.adjustsImageWhenHighlighted = false
myButton4.addTarget(self, action: #selector(ViewController.goDoThis4), forControlEvents:.TouchUpInside)
myView4.addSubview(myButton4)
(Swift 4.0)
First , write a common method for creating button:
func createButton(title:String,toView:UIView,action:Selector) {
let myButton = UIButton(type: UIButtonType.custom)
myButton.setTitle(title, for:.normal)
myButton.titleLabel?.font = UIFont.systemFont(ofSize: 12)
myButton.setTitleColor(UIColor.white, for: .normal)
myButton.backgroundColor = UIColor.darkGray
myButton.frame = CGRect(x: 0, y: 0, width: 200, height: 100)
myButton.alpha = 1
myButton.showsTouchWhenHighlighted = false
myButton.adjustsImageWhenHighlighted = false
myButton.addTarget(self, action: action, for: .touchUpInside)
toView.addSubview(myButton)
}
Then create buttons like this:
let buttonInfos = [
["Text 0",myView0,#selector(ViewController.goDoThis0)],
["Text 1",myView1,#selector(ViewController.goDoThis1)],
["Text 2",myView2,#selector(ViewController.goDoThis2)],
["Text 3",myView3,#selector(ViewController.goDoThis3)],
["Text 4",myView4,#selector(ViewController.goDoThis4)],
]
for buttonInfo in buttonInfos {
self.createButton(title: buttonInfo[0] as! String, toView: buttonInfo[1] as! UIView, action: buttonInfo[2] as! Selector)
}
While this question has already been answered, I would like to contribute another approach adapted from Yun CHEN's answer .
Similarly, create a common method for your buttons:
func createButton(title:String,toView:UIView,action:Selector) {
let myButton = UIButton(type: UIButtonType.custom)
myButton.setTitle(title, for:.normal)
myButton.titleLabel?.font = UIFont.systemFont(ofSize: 12)
myButton.setTitleColor(UIColor.white, for: .normal)
myButton.backgroundColor = UIColor.darkGray
myButton.frame = CGRect(x: 0, y: 0, width: 200, height: 100)
myButton.alpha = 1
myButton.showsTouchWhenHighlighted = false
myButton.adjustsImageWhenHighlighted = false
myButton.addTarget(self, action: action, for: .touchUpInside)
toView.addSubview(myButton)
}
Then list out the button information in an array of tuples:
let buttonInfos = [
("Text 0",myView0,#selector(ViewController.goDoThis0)),
("Text 1",myView1,#selector(ViewController.goDoThis1)),
("Text 2",myView2,#selector(ViewController.goDoThis2)),
("Text 3",myView3,#selector(ViewController.goDoThis3)),
("Text 4",myView4,#selector(ViewController.goDoThis4)),
]
And finally create the buttons like so:
for buttonInfo in buttonInfos {
self.createButton(title: buttonInfo.0, toView: buttonInfo.1, action: buttonInfo.2)
}
As you can see in your case, by using tuples, you do not need to cast the types with as! String
as! String
, as! UIView
as! UIView
etc, simplifying and making the code shorter and safer.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.