Ios 将两个标签连接到一个插座

Ios 将两个标签连接到一个插座,ios,objective-c,uiview,Ios,Objective C,Uiview,现在我知道以前有人问过这个问题,但答案并不令人满意。我的问题是,我有一个视图控制器,其中包含一个视图和一个标签。我为它添加了一堆代码,现在我正在扩展它。我现在遇到了一个问题,我决定将另一个UIView添加到我的接口中,它有一个标签,该标签的功能将与我在第一个UIView中的标签完全相同。我的问题是,我不希望每次操作第一个标签时都必须进入视图控制器方法并添加另一行代码。我是否可以将另一个标签链接到我为第一个标签设置的初始IBOutlet?或者每次操作第一个标签时,我都必须输入代码并添加额外的代码行

现在我知道以前有人问过这个问题,但答案并不令人满意。我的问题是,我有一个视图控制器,其中包含一个视图和一个标签。我为它添加了一堆代码,现在我正在扩展它。我现在遇到了一个问题,我决定将另一个UIView添加到我的接口中,它有一个标签,该标签的功能将与我在第一个UIView中的标签完全相同。我的问题是,我不希望每次操作第一个标签时都必须进入视图控制器方法并添加另一行代码。我是否可以将另一个标签链接到我为第一个标签设置的初始IBOutlet?或者每次操作第一个标签时,我都必须输入代码并添加额外的代码行吗?

这取决于您希望对该标签执行的操作。如果希望以相同的方式更改标签的某些属性,例如字体、文本颜色、对齐方式,则可以将这两个标签放在一个iOutletCollection中,并在视图控制器中迭代该集合

如果希望标签中有不同的数据,但其他属性相同,则需要为该标签提供单独的IBOutlet

您也可以将这两种技术结合起来。e、 g

接口

@property (weak, nonatomic) IBOutlet UILabel *firstName;
@property (weak, nonatomic) IBOutlet UILabel *lastName;
@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *labels;
实施

- (void)viewDidLoad {
  [super viewDidLoad];

  for (UILabel *aLabel in self.labels) {
    // Set all label in the outlet collection to have center aligned text.
    [aLabel setTextAlignment = NSTextAlignmentCenter;
  }

  [self.firstName setText:@"First Name"];
  [self.lastName setText:@"Last Name"];
}

基本上,简单的答案是否定的。无论您使用outlet、outlet集合或标记还是其他什么,您的代码中最终都有一个引用指向接口中的一个标签,代码中的另一个引用指向接口中的另一个引用。你可以压缩你的表达方式,以便在不同答案中建议的那些引用中循环,但基本事实是不可避免的,最终,与标签交谈的唯一方式是通过一个指向该标签和该标签的引用

唯一的解决方法就是根本不使用直接引用。例如,可以使用NSNotification将一封邮件发送给多个收件人。因此,您可以拥有自己的某个UILabel子类的两个实例,并通过发布来自视图控制器的通知同时向这两个实例发出呼喊-然后通知会自动传递给这两个标签,因为您已经事先安排好让它们注册它

类似地,另一种选择是,您可以使用键值观察,以便视图控制器中的更改自动传播到两个标签,因为它们观察到更改,这意味着它们被发送通知—实际上只是通知的一种反向形式。如果这是MacOSX,那么您可以通过使用绑定来实现这种安排的更简单、更安全的版本

然而,我真的不能推荐这种方法。事实上,我们仍然生活在一个极其原始的基于文本的编程世界中,一行一行,一条命令一次,一个引用一次,我们必须咬紧牙关继续前进。

Swift 3,Xcode 8

使用对象创建原型单元 然后添加另一个原型 它将从第一个原型单元复制对象。 新对象将连接到同一个IBOutlet 此外,复制和粘贴对象会维护iActions,但不会维护iBoots


我希望这能回答你的问题,因为其他答案中没有一个能解决这个问题。

谢谢,我意识到在搜索了我的视图控制器文件后,我的标签只有18次使用,这比我想象的要少很多,所以我只选择多出口路线。这是一个非常好的答案,但是如果你想要不同的数据。。。部分不正确。IBOutletCollection只是一个对象的集合-没有任何东西要求您对集合中的每个对象都一视同仁。@Caleb这是公平的,但是如果您在一个对象集合上迭代,并且需要确定它们之间的差异,例如在.tag属性中使用幻数,或者查看其中一个对象的特定类,那么代码清晰性可能更好地使用对象的单独属性。谢谢,我会咬紧牙关添加另一行代码。嘿,matt。如果我想要一个类来表示在故事板中创建的两个不同视图,该怎么办?假设这个类正在用一些标签做一些普通的事情,我在interface builder中将这些视图的class属性更改为我的类,这很好。但是,当我连接一个时,下一个没有连接到插座,因为它已经很忙了。原因是什么?@frangulya,你是否也将两个视图的插座从故事板拖到共享类?有时情节提要会出错,但当情节提要打开时,可以使用助理编辑器查看共享类。只需确保从它处理的两个视图中拖动插座即可!如果您有共享类的父类,也可以将outlets拖到共享类的父类。但是,你知道,老实说,这对我来说不是个好办法。我还是会的 建议您在其他位置提取视图。。