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)
}
}
Quelles données voulez-vous différent pour chaque vue de la balle? – rmaddy
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
Créez une vue personnalisée avec les sous-vues et les propriétés dont vous avez besoin. – rmaddy