Ios 以编程方式添加包含不同数据的新UIView

Ios 以编程方式添加包含不同数据的新UIView,ios,swift,uiview,Ios,Swift,Uiview,背景:每次调用addButtonClicked操作时,我都需要创建一个可拖动的球,球内有不同的数字和名称。我无法真正理解这里的方法。球正确地显示和移动,但如何为每个新球添加不同的数据 是否可以为UIView创建类似于原型单元的内容 class ViewController: UIViewController { //VAR var playerName = "" var number = "" var balls = [UIView]() @IBOutl

背景:每次调用
addButtonClicked
操作时,我都需要创建一个可拖动的球,球内有不同的数字和名称。我无法真正理解这里的方法。球正确地显示和移动,但如何为每个新球添加不同的数据

是否可以为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])
    }

编辑:

当我添加
let player1=mycustomUIview())
时,它说不能调用非函数类型“mycustomUIview”的值 如果我在ViewController中调用
mycustomUiView.InstanceFromnib
,它将显示整个customView。 我的想法是只需按下+按钮,创建不同的可拖动球,其中包含要更改的数据(屏幕截图参考:) 我尝试创建不同的UIView,甚至为每个玩家创建一个不同的viewController,但运气不好,我在网上找不到一个可行的解决方案

MyCustomUIView控制器(从MyCustomUIView.xib连接的插座)

}

主视图控制器

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)



 }   


}

我用以下方法创建了您想要的效果:-

我创建了一个名为PlayerBall.xib的xib文件,我已将其添加到标签中,并将背景色更改为透明色

然后,我创建了一个新的coca touch类PlayerBall.swift,它是UIView的一个子类

将xib文件的类更改为PlayerBall,而不是标准UIView

将标签的出口连接到新创建的类。它应该如下所示:

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
    }

}
现在在主viewController中,为了测试代码,我添加了以下内容

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


}
结果如下:

您可以向自定义类添加更多功能,我只是将其保留为基本概念证明


我希望这会有所帮助

您希望每个球视图有哪些不同的数据?不同的名称、不同的编号。Img参考:。理想情况下,我希望像控制原型单元一样控制它,这样我就可以执行segue并在球上插入不同的注释。创建一个自定义视图,包含您需要的任何子视图和属性。太棒了!这就是我需要的!现在我想,如果我在“action”中添加“instanceforNib()”,它应该会创建一个新的球,这样当应用程序加载时,我就可以没有球了。如果我想点击新创建的球来切换到第二个viewController,我应该以编程方式创建它,对吗?太棒了。绝对可以。如果您愿意,您可以在自定义视图中添加更多自定义项。如果您对答案感到满意,请接受。如果您需要更多帮助,请告诉我是的,只是一件小事,我如何实例化genericViewController()以显示任何球的其他数据?我以前想不出来。只有姓名、号码和一些附加说明。。根据截图()。挑战是,我是在操作中以编程方式连接它,还是应该以另一种方式连接它?
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)
    }


}