【问题标题】:Swift: Add all buttons to an arraySwift:将所有按钮添加到数组中
【发布时间】:2018-11-04 10:59:13
【问题描述】:

我是 Swift 编程的新手。

我创建了一个包含多个相同按钮的应用。我用一个动作创建了一个按钮,然后多次复制这个按钮,以便它使用相同的动作。

有没有一种简单的方法可以将所有这些按钮(大约有 100 个)添加到一个数组中,以便我可以一次性更改所有按钮的图像?

由于有这么多按钮,我希望避免将它们一个接一个地添加到 Outlet 集合中。

如前所述,我是新手,所以越简单越好。

编辑 如果有帮助,按钮的所有实例都带有标签“1”,并且是通过主故事板创建的。

提前致谢, 托马斯

【问题讨论】:

  • 按钮太多了。也许您应该将它们分组到一个表格中,或者使用其他 UI 来组织和管理它们
  • 这取决于你的用户界面,让我们知道你的用户界面
  • 请显示包含按钮的视图的屏幕截图。这将有助于建议最好的方法。
  • 我通过情节提要创建了一个(不是以编程方式),然后多次复制。
  • 这不是正确的方法。如果您将显示 UI,那么我可以查看是否可以在此处使用集合或表格或以其他方式使用。但目前的方式并不好。或者,如果您在 scrollView 上添加了所有按钮,您可以通过检查它们的类或标签,通过 scrollView.subviews 获取它们。

标签: arrays swift button


【解决方案1】:

更新答案:

您的按钮包含在UIStackViews 中。有一个verticalStackView 包含多个horizontalStackViews(每个都有一行UIButtons)。

verticalStackView 创建一个@IBOutlet,然后将您的按钮添加到名为allButtons 的类属性中,并在viewDidLoad 中使用以下代码:

class ViewController: UIViewController {
    @IBOutlet weak var verticalStackView: UIStackView!

    var allButtons = [UIButton]()

    override func viewDidLoad() {
        super.viewDidLoad()

        for case let horizontalStackView as UIStackView in verticalStackView.arrangedSubviews {
            for case let button as UIButton in horizontalStackView.arrangedSubviews {
                allButtons.append(button)
            }
        }
    }
}

原答案:

要创建一个包含所有UIButtons 和tag == 1 的数组:

使用条件转换 as? UIButtoncompactMap 查找 outerView.subviews 中的所有按钮,然后使用 filter 选择带有 tag == 1 的按钮:

class ViewController: UIViewController {
    @IBOutlet weak var outerView: UIView!

    var allButtons: [UIButton] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        allButtons = outerView.subviews
                         .compactMap { $0 as? UIButton }
                         .filter { $0.tag == 1 }
    }

}

注意:outerView 是包含按钮的UIView。为该视图创建一个@IBOutlet 以使此代码正常工作。

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • 有效!有用!有用!非常感谢!使用了新代码,现在它可以工作了。非常感谢您对此的所有帮助和耐心。然而,不太确定 for 循环究竟做了什么,但它确实有效。再次感谢:)
  • 不客气。外部 for 循环只是循环通过垂直堆栈视图的子视图,每次通过循环拾取一个水平堆栈视图。内部 for 循环遍历该水平堆栈视图所持有的按钮。每个按钮都附加到数组中。
  • 有道理。再次感谢:)
【解决方案2】:

1- 制作一个按钮数组

let arrayOfButtons: [UIButton]

2- 初始化它(给它一个值) 3-然后使用循环来更改值,例如设置按钮图像

for button in arrayOfButtons {
    button.setImage(UIImage, forState: UIControlState.Normal)
}

【讨论】:

    【解决方案3】:
    let arrayOfButtons: [UIButton]
    
        for i in 0....100 {
            let button  = UIButton()
    
            button.setImage(UIImage, forState: .normal)
            button.setTitle("test", for: .normal)
            button.addTarget(self, action: #selector(clickBackButton(_:)), for: .touchUpInside)
    
            arrayOfButtons.append(button)
        }
    
    @IBAction func clickBackButton(_ sender: UIButton)
    {
    }
    

    你可以做任何计数,我已经用标题和图片添加了 100 个按钮。

    【讨论】:

    • 谢谢。它如何知道要更新哪些按钮?如上所述,我有大约 100 个按钮,例如我需要一次性更改所有按钮的图像。循环如何知道要更改哪些按钮(例如不是初始化更新的按钮)?这些按钮的操作如下所示(如果有帮助):@IBAction func imageButtonPressed(_ sender: UIButton)
    • 要解决这个问题,请使用buttons.forEach { if $0 != sender { $0.setImage(image, forState: .normal } } 之类的东西。这将遍历集合中的所有按钮并更新所有按钮不等于触发操作的按钮的图像。
    【解决方案4】:

    第一步:将所有按钮连接到swift文件中的单个IBAction

    第二步:给所有按钮一个通用的特殊标签,如 1010、1007、.. 等

    第三步:在您的 IBAction 中编写下面给出的代码

    @IBAction func didPressBtn(_ sender: Any) {
        for btn in self.view.subviews{
           if btn.tag == 1010
           {
                    let btnRefrence = btn as! UIButton
                    btnRefrence.setImage(img, for:.normal)
    
            }
        }
    }
    

    希望有帮助

    【讨论】:

    • 谢谢,但我想避免做一个收集出口,因为按钮太多了。
    • 对不起,我想我在发布此内容时可能不清楚。我有大约 100 个图像按钮:然后我有另一个按钮(“重置”)应该更改所有这些按钮的图像。我相信在上面,它会改变所选按钮的背景颜色,对吧?
    • 我刚试过上面的。如果我使用 btn.setImage(UIImage(named: "image1"), for: .normal) 它表示 UIView 没有成员 'setImage'。
    • 不,请看第 1 步,您将所有按钮连接到相同的 IBAction 代码,因此无论您单击 100 个按钮中的哪一个,它都会在每次按钮单击时执行,我们正在遍历所有子视图self.view 的(所有按钮都是 self.view 的子视图),我们正在从那个特殊标签中检测按钮
    • for case let btn as UIButton in self.view.subviews where btn.tag == 1 {
    猜你喜欢
    • 2016-05-15
    • 2018-08-10
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多