一次引用 2 个不同的 IBOutlets 的最有效方法(每个 IBOutlets 只存在于它自己的大小 class)?

Most efficient way to reference 2 different IBOutlets at once (where each one only exists for it's own size class)?

我目前正在使用统一故事板(大小为 classes)。对于我的观点之一,wAny hAny 和 wRegular hRegular 大小 classes 之间的设计差异足够大,以至于根据大小 class 更改子视图的约束是不够的。

一个简单的例子:我有一个 wAny hAny 大小 class 的 UILabel,名为 "First_Name_Label"。虽然我希望为 wRegular hRegular 大小 class 重用此 UILabel,但设计差异太大,因此我为 wRegular hRegular 大小 class 添加了一个 UILabel 以复制 "First_Name_Label" 的目的,我称之为 "First_Name_Label 2"。 "First_Name_Label"只安装在wAny hAny size class,"First_Name_Label 2"只安装在wRegular hRegular size class.

在我的代码中,我想设置标签的文本:

self.First_Name_Label.text = "my first name"

但是我也需要为其他尺寸class做,我的代码如下:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomIpad) {
    self.First_Name_Label2.text = "my first name"
} else {
    self.First_Name_Label.text = "my first name"
}

这看起来很麻烦,基本上是我现在代码的两倍。我确信有一种更优雅、更有效的方法可以同时引用这 2 个 IBOutlet(每个都属于不同的大小 class)。

只使用可选项:

self.First_Name_Label2?.text = "my first name"
self.First_Name_Label?.text = "my first name"

在这种情况下,First_Name_Label 和 First_Name_Label2 是可选的,如果未初始化,代码将忽略它。 利用它们在 class 中也被声明为可选项:

var First_Name_Label:UILabelView?
var First_Name_Label2:UILabelView?

您不能将 IBOutlet 属性 与多个对象连接。

但是您可以在这些标签上使用相同的标签并像这样访问它们:

(UILabel *)[self.view viewWithTag:LABEL_TAG];

您考虑过使用 IBOutletCollection 吗?

例如

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *First_Name_Labels;

在代码中,您调用:

for (UILabel *First_Name_Label in self.First_Name_Labels) { First_Name_Label.text = "my first name"; }

这也很容易让您将范围扩大到更大的规模 类。