Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何像调用数组一样调用标签_Objective C_Xcode - Fatal编程技术网

Objective c 如何像调用数组一样调用标签

Objective c 如何像调用数组一样调用标签,objective-c,xcode,Objective C,Xcode,我有10个不同的标签,从1分到10分。有没有办法像数组一样访问它们。例如ScoreX,在For循环中有一个x。如果您想将它们显式地作为数组,您可以创建自己的数组。 或者,您可以创建单个映射到标签的IBOutletCollection集合使用IBOutletCollection 您可以分配标签,然后在循环中使用标签查看标签 IBOutletCollection的问题在于不能保证数组的顺序。正如nshipster文章中提到的,顺序大致与它们在故事板中的连接顺序相对应,但在Xcode的不同实例中,有

我有10个不同的标签,从1分到10分。有没有办法像数组一样访问它们。例如ScoreX,在For循环中有一个x。

如果您想将它们显式地作为数组,您可以创建自己的数组。
或者,您可以创建单个映射到标签的
IBOutletCollection
集合

使用
IBOutletCollection


您可以分配标签,然后在循环中使用标签查看标签

IBOutletCollection的问题在于不能保证数组的顺序。正如nshipster文章中提到的,顺序大致与它们在故事板中的连接顺序相对应,但在Xcode的不同实例中,有一些实例没有出现这种情况。因此,使用IBOutletCollection不是一个好主意

相反,您应该使用IBOutletCollection和标记的组合

  • 在视图控制器中定义UILabel的iOutletCollection。
    @property(非原子,强)IBOutletCollection(UILabel)NSArray*标签
  • 将标签连接到此集合
  • 根据要引用的正确顺序为每个标签设置标记
  • viewDidLoad
    awakeFromNib
    中,迭代通过IBOutletCollection数组,并按其标记对该数组进行排序
  • 如果定义了属性Score0到Score9,则可以根据它们的标记来分配它们。或者,如果您有数组分数[],则可以在排序期间将相应的标签分配给数组项
  • 然后,您将能够使用索引访问它

    另一种不同的策略是使用
    UIStackView
    。如果标签是垂直或水平排列的,则可以将其嵌入堆栈视图中,然后使用
    arrangedSubviews
    数组访问标签。阵列的顺序似乎与它们在堆栈视图中的排列顺序相匹配

    作为对评论的回应,这里有一个你可以使用的解决方案

  • 在ViewController内创建结构
  • struct ScoreLabels{
    让视图:UIView!
    下标(索引:Int)->UILabel{
    返回视图。将标签(索引)作为UILabel的视图;
    }
    }

  • 您的Score属性应为time ScoreLabels。它还应该是computed属性,返回通过VC视图的ScoreLabels实例

    var分数:分数标签{
    返回ViewController.ScoreLabels(视图:self.view)
    }

  • 现在,您可以通过
    Score[index]
    访问标签。确保您的索引是基于0的

  • 通过直接在ViewController中定义下标,将视图更改为
    self.view
    并使用
    self[index]

    一个最简单的解决方案是定义一个函数并将其调用为Score(0)、Score(1)、Score(2)等

    func分数(索引:Int)->UILabel?{
    将self.view.viewWithTag(索引)作为UILabel返回
    }

    ObjC实施 可以在ViewController中实现此方法

    - (id)objectAtIndexedSubscript:(NSInteger)idx
    {
        return [self.view viewWithTag:idx];
    }
    
    然后,您可以作为self[index]访问标签,其中index是标签的标记

    如果不想在ViewController中执行此操作,则可以定义一个自定义类,将VC的视图作为参数传递给该类,然后使用Score属性,如下所示

    @interface ScoreLabels : NSObject
    @property (nonatomic, assign) UIView *parentView;
    @end
    
    @implementation ScoreLabels
    -(id)initWithView:(UIView *)view {
        self = [super init];
        if (self != nil) {
            self.parentView = view;
        }
        return self;
    }
    - (id)objectAtIndexedSubscript:(NSInteger)idx
    {
        return [self.parentView viewWithTag:idx];
    }
    @end
    
    在视图控制器中定义一个属性

    @属性(非原子,强)ScoreLabels*分数

    并用VC的观点初始化它

    self.Score=[[ScoreLabels alloc]initWithView:self.view]

    并访问它作为

    UILabel*label=(UILabel*)self.Score[1];
    
    label.text=@“您的字符串”

    可能是这样,特别是对于不习惯IB的人。但是IBOutletCollection也不是完美的,因为它的顺序没有保证。好的,我想我为标签设置了所有标签,但我仍然不知道如何在viewDidLoad中访问它们。该属性的名称为
    Score
    ,所有标签都有标签1到10。我想您在swift中键入了您的响应。。。我在回答中使用了Objective CAdded ObjC实现,我能够为(intx=0;x)使用