【问题标题】:Swift put multiple IBOutlets in an ArraySwift 将多个 IBOutlets 放在一个数组中
【发布时间】:2014-07-17 13:38:31
【问题描述】:

我使用ctrl + drag制作了这些(标有红色边框)IBOutlets

但我不喜欢完全相同的行 9 次 (DRY)

如何将这些 IBOutlets 放入一个数组中?

【问题讨论】:

    标签: ios swift cocoa iboutlet iboutletcollection


    【解决方案1】:

    你可以像这样在 Swift 中定义一个通用的插座集合:

    @IBOutlet var collectionOfViews: Array<UIView>? // = [UIView]?
    

    或例如UIButton对象:

    @IBOutlet var collectionOfButtons: Array<UIButton>? // = [UIButton]?
    

    您可以在 Outlet Collections 组下找到您的收藏,就像通常在 File's Owner 中一样:

    连接 5 个随机按钮后,它会在我的控制台上显示:

    【讨论】:

    • 如何将storybord中的按钮连接到这个数组?
    • @CorPruijs,您可以在 Outlet Collections 组下找到您的收藏。您可以像通常在一个插座的情况下那样将多个项目连接到集合。
    • 我不断收到“在 super.init 调用时未初始化”错误,我尝试过“@IBOutlet var levelField: Array = Array”和“@IBOutlet var levelField: Array = UIButton" 并使用 for 循环但没有任何效果
    • @CorPruijs,这是你的代码,@IBOutlet var levelField: Array&lt;UIButton&gt; = Array&lt;UIButton&gt;...?您不需要正确大小的操作数,请将 = 符号后面的所有内容都扔掉,包括 = ;请看我的回答,我没有分配任何东西,因为它是不必要的。
    • 这是我尝试的第一件事,但没有奏效。
      然后我尝试使用 = Array 东西,因为我在执行单个按钮时需要“= UIButton()”
    【解决方案2】:

    按照以下步骤创建一个插座阵列并将其与 IB 元素连接:

    • 创建一个 IBOutlets 数组
    • 在 Storyboard ViewController 界面中添加多个 UIElement(视图)
    • 选择 ViewController(在情节提要中)并打开连接检查器
    • 连接检查器中有“Outlet Collections”选项(您将在那里看到一系列插座)
    • 与您的界面元素连接

    -

    class ViewController2: UIViewController {
    
    
        @IBOutlet var collection:[UIView]!
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    

    【讨论】:

      【解决方案3】:

      解决方案在这里Swift - IBOutletCollection equivalent

      @IBOutlet var objectCollection: [对象]

      【讨论】:

      • 这个答案太简短了,没有提供任何细节,应该被删除。
      • 或者,也许作者可以扩展他们的答案
      • 答案只要简短
      【解决方案4】:

      这适用于 macOS(应该与 iOS 类似),我在故事板中没有找到“Outlet Collections”(看起来他们取消了该选项)。所以我把我所有的按钮都放在NSStackView 中,并从故事板链接堆栈

      @IBOutlet weak var buttons: NSStackView!
      

      然后我遍历它们以进行相应的更改

      for case let (index, button as NSButton) in buttons.arrangedSubviews.enumerated() {
                  if(index + 1 != someButtonIndex) {button.state = .off}
                  else {button.state = .on}
              }
      

      您也可以使用tag 代替index

      【讨论】:

        【解决方案5】:

        从两个视图窗格开始,您可以在其中看到代码和情节提要。当您第一次从 UI 连接到代码时,只需仔细查看 Connection 下拉字段并选择名为“Outlet Collection”的选项。这将自动创建一个 IBOutlets 数组。接下来只需在一个圆圈中查找小黑圈,该圆圈位于您的代码中创建数组的位置。只需从这个圈子拖动到您想要连接到同一集合的所有其他 UI 对象(不确定是否可以混合类型)。同样,您可以通过从创建的第一个黑点拖动到要连接到该操作的所有其他对象,将所有对象连接到一个操作。还可以考虑使用 EnumerateSequence() 来帮助使用此集合。甜蜜对吧?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多