2017-10-21 112 views
0

J'ai écrit du code ci-dessous qui crée par programme plusieurs UIButton qui sont placés sur différents UIView. Tous les boutons sont similaires et différents par le titre du bouton. Le code accomplit ce qu'il doit faire, mais comme vous pouvez le voir, le code est plutôt verbeux, c'est trop long.Ajout de plusieurs UIButton à plusieurs UIView dans Swift


Question

Comment puis-je structurer le code ci-dessous et de le rendre compact et 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) 
+0

Cette question correspond probablement mieux au forum de révision de base - https://codereview.stackexchange.com - mais au-dessus de ma tête, pourquoi ne pas étendre 'UIButton', en créant un initialiseur' convenience' qui enveloppe le code de chaque bouton en un seul appel? Vous pouvez même passer les paramètres 'addTarget' dans l'initialiseur. (Je le fais tout le temps.) – dfd

+0

Sous-classe l'uibutton –

Répondre

1

(Swift 4.0)
Première, écrire une méthode commune pour la création de bouton:

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) 
} 

Ensuite créer des boutons comme celui-ci:

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) 
} 
+0

Parfait. L'explication et le code m'ont montré une nouvelle technique. Merci beaucoup! – user4806509

+1

:), vous êtes les bienvenus! –

1

Bien que cette question ait déjà reçu une réponse, j'aimerais apporter une autre approche adaptée de Yun CHEN's answer.

De même, créer une méthode commune pour vos boutons:

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) 
} 

Dressez ensuite la liste les informations de bouton dans un tableau de 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)), 
        ] 

Et enfin créer les boutons comme ceci:

for buttonInfo in buttonInfos { 
    self.createButton(title: buttonInfo.0, toView: buttonInfo.1, action: buttonInfo.2) 
} 

Comme vous pouvez le voir dans votre cas, en utilisant des tuples, vous n'avez pas besoin de lancer les types avec as! String, as! UIView etc, simplifiant et rendant le code plus court et plus sûr.

+0

Merci pour cette alternative! – user4806509

+0

De rien! :) – LWJ