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

Posted

技术标签:

【中文标题】一次引用 2 个不同 IBOutlets 的最有效方法(其中每个只存在于它自己的大小类中)?【英文标题】:Most efficient way to reference 2 different IBOutlets at once (where each one only exists for it's own size class)? 【发布时间】:2015-06-10 00:09:50 【问题描述】:

我目前正在使用统一的故事板(带有尺寸等级)。对于我的观点之一,wAny hAny 和 wRegular hRegular 尺寸类之间的设计差异非常显着,以至于基于尺寸类改变子视图的约束是不够的。

一个简化的示例:我在 wAny hAny 大小类中有一个 UILabel,名为“First_Name_Label”。虽然我希望将这个 UILabel 用于 wRegular hRegular 尺寸类,但设计差异太大,所以我为 wRegular hRegular 尺寸类添加了一个 UILabel 以复制“First_Name_Label”的用途,我称之为“First_Name_Label 2”。 “First_Name_Label”仅安装在 wAny hAny 尺寸类中,“First_Name_Label 2”仅安装在 wRegular hRegular 尺寸类中。

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

self.First_Name_Label.text = "my first name"

但我也需要为其他尺寸类做这件事,我的代码如下:

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

这看起来很麻烦,基本上是我现在的代码翻了一番。我确信有一种更优雅、更有效的方式来一次引用这 2 个 IBOutlets(每个都属于不同的大小类)。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

在这种情况下,我不必创建另一个 IBOutlet(只需将标签添加到另一个 UILabel),但 viewWithTag 只会返回 1 个 UILabel 吗?所以我仍然需要为其他尺寸类的 UILabel 编写单独的代码? 不,您不必编写单独的代码,因为在给定尺寸等级下只有一个标签可用。【参考方案2】:

只使用选项:

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

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

var First_Name_Label:UILabelView?
var First_Name_Label2:UILabelView?

【讨论】:

谢谢伊卡罗。我的问题是,每次我想对标签做某事(每个标签一行)时,我仍然需要写出另一行代码,尽管我必须使用 If/else。 【参考方案3】:

您是否考虑过使用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";

这也让您可以轻松地将范围扩展到更多尺寸类别。

【讨论】:

以上是关于一次引用 2 个不同 IBOutlets 的最有效方法(其中每个只存在于它自己的大小类中)?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中追加数组的最有效方法?

在 laravel 中链接 2 个数据集的最有效方法

从包含 10 亿个整数的文件中显示前 100 个整数的最有效方法。内存最多可容纳 100 万个整数

从排序字符串数组中找到第一个前缀匹配的最有效算法?

在 Segue 之后失去@IBOutlets

检查具有数字和字符数据的 2 个数据帧之间差异的最有效方法?