【问题标题】:How to make IBOutlets out of an array of objects?如何从对象数组中制作 IBOutlets?
【发布时间】:2010-12-05 00:16:11
【问题描述】:

我想用我在 Interface Builder 中的一堆 UIImageViews 创建一个数组。而不是 20 或 30

IBOutlet UIImageView *img1;

并以这种方式链接它们,然后将它们放入一个数组中,有没有办法声明一个 IBOutlet UIImageViews 数组?

只是为了让我的头文件中没有那么多声明。

【问题讨论】:

    标签: ios iphone interface-builder iboutlet iboutletcollection


    【解决方案1】:

    有可能,这叫outlet collection。这是定义插座集合的方式:

    @property(retain) IBOutletCollection(UIImageView) NSArray *images;
    

    现在您可以在 Interface Builder 中将多个对象粘贴到插座中,加载界面时将为您创建数组。

    【讨论】:

    • 我花了很长时间才弄清楚如何在 xcode 4 中“将多个对象插入插座”。在代码中创建 IBOutletCollection 后,我希望能够从 CTRL-Drag UIImageView 到它。由于某种原因,这不起作用。起作用的是选择“文件所有者”,然后打开“连接检查器”,然后依次从“插座集合”部分拖动到每个 UIImageView。
    • 我不知道如何实现这一点 - 谢谢@BenClayton!
    • 在 xcode 5 的开发者预览版中,@BenClayton 提到的问题似乎已经解决 - CTRL-Drag 现在可以绑定到数组。不错的答案!
    【解决方案2】:

    我在这里有点晚了,但是在 IB 中设置每个 ImageView 的 tag 属性可能更容易,然后像 [some_superview viewWithTag:tag] 一样访问它们,而不是为每个单独的句柄保留一个单独的句柄。

    【讨论】:

      【解决方案3】:

      Swift 3 及更高版本:

      @IBOutlet var stuckLabels: [UIImageView]
      

      【讨论】:

        【解决方案4】:

        这里有更简单的方法。

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

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

        -

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

        【讨论】:

          【解决方案5】:

          很遗憾,没有,但您可以将所有声明放在一行中:

          IBOutlet UIImageView *img1, *img2, *img3, *img4;
          

          另一个选项(可能是最好的,因为你有这么多)是以编程方式创建它们并将它们存储在一个数组中,然后将它们从你的视图控制器类添加到视图中,为每个使用,

          [self.view addSubview:img];
          

          另外,请记住,如果元素是静态的(如背景元素),并且您实际上不需要访问它们,则不需要为每个元素声明 outlet;您可以将它们添加到 nib 文件中,然后忘记它们。

          UIButton 实例也是如此。如果您不需要更改按钮的任何内容,则可以从它调用的方法中访问它,如下所示:

          -(IBAction) buttonPressed:(id)sender {
              UIButton *button = (UIButton *)sender;
              // method guts
              // stuff with button -- access tag, disable, etc
          }
          

          【讨论】:

          • 我会以编程方式创建它们,但它们都需要放在某些地方,我不想设置每个放置的位置。我需要在某些时候将它们从隐藏更改为不隐藏,所以我需要能够访问它们。单行声明至少会让它看起来更整洁。
          • 是的,我们在 iPhone 上没有可可绑定,所以这确实是我们能做的最好的。这回答了问题吗?
          猜你喜欢
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-27
          • 2023-03-13
          相关资源
          最近更新 更多