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