2016-08-03 40 views
0

Ich versuche, Subviews in meiner App programmgesteuert zu erstellen, im Grunde bin ich ein Anfänger in Swift, während ich versuche, 9 Subview zu erstellen. Ich habe einen Fehler „Can not Wert vom Typ‚int‘in Erwartetes Argument Typ‚CGFloat‘convert“ CGFloat Werte sind ein & BKann Wert von Typ int nicht in erwarteter Argumenttyp 'CGfloat' konvertieren

import Foundation 
import UIKit 

@IBDesignable 
class Subview: UIView { 

    @IBInspectable var view1 : UIView = UIView() { 
     didSet { 
      var A:CGFloat = 0 
      var B:CGFloat = 0 
      for A in 1...3 { 
       for B in 1...3 { 
        view1.frame = CGRectMake(A,B, 100, 100) 
        view1.backgroundColor = UIColor.blueColor() 
        self.addSubview(view1) 
       } 
      } 
     } 
    } 

} 
+0

Ich schlage vor, Sie verwenden Swift-Initialisierer, dh 'CGRect (x: y: width: height:)' anstelle von 'CGRectMake()' – EmilioPelaez

Antwort

2

Sie überlastet A und B Variablen in Zyklen mit demselben Namen, aber Int Typ Variablen (Lesen Sie mehr über for in Zyklus). Sie müssen keine Variablen deklarieren, bevor Sie sie als Elemente in for in verwenden. Sie werden implizit im lokalen Zyklus mit dem Typ der Elemente Ihrer Sammlung erstellt (in Ihrem Fall wiederum Int). CGRectMake(_:_:_:_:) erwarten von Ihnen CGFloat 's; und als @Martin R wies darauf hin, Sie besser verwenden CGRect(x:y:width:height:). Dieser Code löst das Problem des Konvertierungstyps:

didSet { 
    for A in 1...3 { 
     for B in 1...3 { 
      view1.frame = CGRect(x: A, y: B, width: 100, height: 100) 
      view1.backgroundColor = UIColor.blueColor() 
      self.addSubview(view1) 
     } 
    } 
} 

Aber es haben andere, logische Probleme. Instanz von UIView (view1) kann nur in einer Ansichtshierarchie gleichzeitig hinzugefügt werden. Also in der Tat, alle Code in Ihrem didSet haben nur gleiches Ergebnis wie dieser Code:

didSet { 
    view1.frame = CGRect(x: 3, y: 3, width: 100, height: 100) 
    view1.backgroundColor = UIColor.blueColor() 
    self.addSubview(view1) 
} 

Beachten Sie auch, dass didSet Beobachter nicht auf Initialisierungsschritt aufgerufen, wenn Sie also nicht view1 Eigenschaft dieser Code wird neu zuweisen werden nie ausgeführt werden.

+3

Besser verwenden Sie 'CGRect (x: A, y: B, Breite: 100, Höhe: 100)' ', da 'CGRectMake' in Swift 3 entfernt wird (und es spart Ihnen die Typumwandlung). –

0

@NDoc Antwort wird Ihnen helfen, aber Sie müssen wissen, wie in Werken Sie nicht erklären müssen, A und B, benutzen Sie einfach

for A in 0...3 { 
for B in 0...3 { 

es von selbst erhöhen wird