首页 > 解决方案 > 如何从 Swift 中的数组以编程方式在堆栈中创建按钮

问题描述

我是 Swift 新手,我想知道如何从数组中获取一些值并将它们转换为堆栈中的按钮。我有一个包含狗及其信息的数组。我希望按钮显示每只狗的名字。狗的数量可以改变,所以我需要改变堆栈以反映数组中的内容。我真的迷路了,我知道我需要将此代码添加到视图控制器但我找不到与此类似的任何内容

这是我的数组:

var myDogs = [
        Dog(name: "Saleks", gender: "Male", speed: 50),
        Dog(name: "Balto", gender: "Male", speed: 70),
        Dog(name: "Mila", gender: "Female", speed: 20)
    ]

这是我的视图控制器:

    @IBOutlet weak var buttonsStack: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()
        for Dog in myDogs {
        print("\(Dog.name)")
    }

//向数组中添加一条新狗

@IBAction func buyDogButton(_ sender: UIButton) {
func buyDog() {
myDogs.append(Dog(name: "Dogname", gender: "female", speed: 20))

}

标签: arraysswift

解决方案


我会这样做:

所以代码看起来像这样(在视图 DidLoad 中):

var myDogs = [
              Dog(name: "Saleks", gender: "Male", speed: 50),
              Dog(name: "Balto", gender: "Male", speed: 70),
              Dog(name: "Mila", gender: "Female", speed: 20)
          ]

let stackView   = UIStackView(frame: CGRect(x: 40, y: 100, width: 60, height: 100))
stackView.backgroundColor = .red
stackView.axis  = NSLayoutConstraint.Axis.vertical
stackView.distribution  = UIStackView.Distribution.equalSpacing
stackView.alignment = UIStackView.Alignment.center
stackView.spacing   = 16.0
      
for dog in myDogs {
    let button = UIButton() // Need to set the IBAction
    button.setTitleColor(.blue, for: UIControl.State.normal)
    button.setTitle(dog.name, for: UIControl.State.normal)  // "Click"
    button.backgroundColor = .red
    stackView.addArrangedSubview(button)
 }

 stackView.translatesAutoresizingMaskIntoConstraints = false

 self.view.addSubview(stackView)
      //Constraints
 stackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
 stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

我将背景颜色设置为红色以使按钮非常明显您可能希望拥有具有共同宽度的按钮,然后在创建按钮时设置它们的框架。


推荐阅读