一次引用 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 的最有效方法(其中每个只存在于它自己的大小类中)?的主要内容,如果未能解决你的问题,请参考以下文章