如何将标签称为数组

时间:2016-02-29 03:19:12

标签: objective-c xcode

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

4 个答案:

答案 0 :(得分:0)

如果您希望将这些显式地用作数组,则可以创建自己的数组。 或者,您可以创建映射到标签的单个IBOutlet集合

答案 1 :(得分:0)

答案 2 :(得分:0)

IBOutletCollection的问题是无法保证数组的顺序。正如在nshipster文章中提到的那样,顺序大致对应于它们在故事板中连接的顺序,但是在Xcode的不同实例中存在实例,其中没有阻止它。所以使用IBOutletCollection不是一个好主意。

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

  1. 在视图控制器中定义UILabel的IBOutletCollection。 @property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;
  2. 将您的标签连接到此系列。
  3. 根据您希望引用它们的正确顺序为每个标签设置标记。
  4. viewDidLoadawakeFromNib中通过IBOutletCollection数组进行迭代,并按其标记对该数组进行排序。
  5. 如果您已定义属性Score0至Score9,则可以根据其标记进行分配。或者,如果您有一个数组Scores [],那么您可以在排序期间为数组项分配相应的标签。
  6. 然后您就可以使用索引访问它了。

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

    回应此处的评论,您可以使用一种解决方案。

    1. 在ViewController
    2. 中创建一个结构

      struct ScoreLabels { let view:UIView! subscript (index:Int) -> UILabel? { return view.viewWithTag(index) as? UILabel; } }

      1. 您的分数属性应该是ScoreLabels的时间。此外,它应该是computed属性,它返回通过VC视图的ScoreLabels实例。

        var Score:ScoreLabels { return ViewController.ScoreLabels(view: self.view) }

      2. 现在您可以访问标签Score[index]。确保您的索引从0开始。

      3. 您还可以通过直接在ViewController中定义下标并将视图更改为self.view并使用self[index]

        来避免创建结构

        一个最简单的解决方案是定义一个函数并将其称为分数(0),分数(1),分数(2)等。

        func Score(index:Int) -> UILabel? { return self.view.viewWithTag(index) as? 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
        

        在视图控制器中定义属性

        @property (nonatomic, strong) ScoreLabels *Score;

        并使用VC的视图初始化

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

        并将其作为

        访问

        UILabel *label = (UILabel *)self.Score[1]; label.text = @"Your string";

答案 3 :(得分:-2)

您可以在循环中指定标签然后-viewWithTag来查找标签。