2017-09-10 4 views
0

Contexte: J'ai besoin de créer une boule draggable avec un numéro différent et un nom à l'intérieur chaque fois que j'appelle l'action addButtonClicked. Je ne peux pas vraiment comprendre l'approche ici. La balle montre et se déplace correctement, mais comment puis-je ajouter des données différentes pour chaque nouvelle balle?Ajouter un nouveau UIView par programmation avec différentes données à l'intérieur

Est-il possible de créer quelque chose comme une cellule prototype pour UIView?

class ViewController: UIViewController { 
    //VAR 
    var playerName = "" 
    var number = "" 
    var balls = [UIView]() 

    @IBOutlet weak var ball: UIView! 
    @IBOutlet weak var addButton: UIBarButtonItem! 
    @IBOutlet weak var numberLabel: UILabel! 

    @IBAction func handlePan(recognizer:UIPanGestureRecognizer) { 
     let translation = recognizer.translation(in: self.view) 
     if let view = recognizer.view { 
      view.center = CGPoint(x:view.center.x + translation.x, 
            y:view.center.y + translation.y) 
     } 
     recognizer.setTranslation(CGPoint.zero, in: self.view) 
    } 

    // ACTIONS 
    @IBAction func addButtonClicked(_ sender: Any) { 
     let newBall=UIView(frame: CGRect(x: 10, y: 100, width: 50, height: 50)) 

     // Change UIView background colour 
     newBall.backgroundColor=UIColor.white 

     // Add rounded corners to UIView 
     newBall.layer.cornerRadius=25 

     // Add border to UIView 
     newBall.layer.borderWidth=0 

     let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     newBall.addGestureRecognizer(gestureRecognizer) 

     // Add UIView as a Subview 
     self.view.addSubview(newBall) 

     balls.append(newBall) 
     print ([balls]) 
    } 

EDIT:

quand j'ajouter let player1 = mycustomUIview()) il dit ne peut pas appeler la valeur de type non-fonction 'mycustomUIView' si j'appelle mycustomUiView.instantiatefromNib en ViewController Il montre toute CustomView. Mon idée est simplement d'appuyer sur un bouton + et créer des balles différentes avec des données à changer à l'intérieur (capture d'écran: https://imgur.com/a/fRiTE) J'ai essayé de créer différents UIViews, même un viewController différent pour chaque joueur, mais pas de chance, je ne peux pas trouver une solution de travail unique en ligne.

MyCustomUIViewController (sorties raccordées de MyCustomUIView.xib)

class playerBall: UIView { 


@IBOutlet weak var contentView: UIView! 
@IBOutlet weak var contentViewBall: UIView! 
@IBOutlet weak var contentViewNumberLabel: UILabel! 
@IBOutlet weak var contentViewNameLabel: UILabel! 

// MARK: - Initializers 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    setupView() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setupView() 
} 


// Performs the initial setup. 
private func setupView() { 
    let view = viewFromNibForClass() 
    view.frame = bounds 

    // Auto-layout 
    view.autoresizingMask = [ 
     UIViewAutoresizing.flexibleWidth, 
     UIViewAutoresizing.flexibleHeight 
    ] 

    // Show view. 
    addSubview(view) 
} 

// Load XIB file into view and return this view. 
func viewFromNibForClass() -> UIView { 

    let bundle = Bundle(for: type(of: self)) 
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle) 
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView 

    return view 
} 

}

MainViewController

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 


    playerBall.contentViewNameLabel.text = "Player" 
    playerBall.contentViewNumberLabel.text = "10" 

} 



@IBOutlet weak var playerBall: playerBall! 


@IBAction func buttonPressed(_ sender: Any) { 



    var customView = playerBall.viewFromNibForClass() 
    self.view.addSubview(customView) 



} 


} 
+0

Quelles données voulez-vous différent pour chaque vue de la balle? – rmaddy

+0

Nom différent, numéro différent. Img référence: https://imgur.com/a/6OATe. Idéalement, je voudrais le contrôler comme une cellule prototype, donc je peux effectuer une segue et insérer des notes différentes sur les balles. – dan

+0

Créez une vue personnalisée avec les sous-vues et les propriétés dont vous avez besoin. – rmaddy

Répondre

0

i créer l'effet désiré de ce qui suit: -

i créé un fichier xib que j'ai appelé PlayerBall.xib, j'ai adde d pour étiqueter et changer la couleur d'arrière-plan pour effacer la couleur ..

J'ai ensuite créé une nouvelle classe tactile coca PlayerBall.swift qui est une sous-classe de UIView.

changer la classe du fichier à PlayerBall au lieu xib de la norme UIView

connecter les sorties des étiquettes à la classe nouvellement créée. il devrait se présenter comme suit:

class PlayerBall: UIView { 

    @IBOutlet weak var playerNumber: UILabel!{ 
     didSet{ 
      playerNumber.layer.cornerRadius = playerNumber.frame.width/2 
      playerNumber.layer.masksToBounds = true 
     } 
    } 

    @IBOutlet weak var playerName: UILabel! 


    class func instanceFromNib() -> PlayerBall { 
     return UINib(nibName: "PlayerBall", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! PlayerBall 
    } 

} 

maintenant dans la principale viewController pour tester le code i ajouté ce qui suit

override func viewDidLoad() { 
    super.viewDidLoad() 


    for i in 1...5 { 
     let ball = PlayerBall.instanceFromNib() 
     ball.playerNumber.text = "\(i)" 
     ball.playerName.text = "Player " + ball.playerNumber.text! 
     let randomX = arc4random_uniform(UInt32(view.frame.width)) 
     let randomY = arc4random_uniform(UInt32(view.frame.height)) 
     ball.center = CGPoint(x: CGFloat(randomX), y: CGFloat(randomY)) 
     view.addSubview(ball) 
    } 


} 

Le résultat est le suivant: the result

vous pouvez ajouter plus de fonctionnalités à la classe personnalisée je l'ai juste gardé basique comme une preuve de concept.

J'espère que cela aide

+0

Incroyable! C'est ce dont j'avais besoin! maintenant je suppose que si j'ajoute 'instanceforNib()' à l'intérieur d'une 'action' il devrait créer une nouvelle boule afin que je puisse avoir zéro balles quand l'application se charge. si je veux appuyer sur la nouvelle boule créée pour segue à un second viewController, dois-je créer cela par programme, non? Incroyable. – dan

+0

Absolument ... vous pouvez ajouter plus de personnalisation à la vue personnalisée si vous désirez – OverD

+0

Et si votre satisfait de la réponse s'il vous plaît l'accepter ... et si vous avez besoin de plus d'aide s'il vous plaît laissez-moi savoir – OverD