简体   繁体   中英

Adding multiple UIButton to multiple UIView in Swift

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM