我有10个不同的标签,分数1到分数10。有没有办法像数组一样访问它们。例如ScoreX,在for循环中带有x。
答案 0 :(得分:0)
如果您希望将这些显式地用作数组,则可以创建自己的数组。
或者,您可以创建映射到标签的单个IBOutlet
集合
答案 1 :(得分:0)
使用IBOutletCollection
How can I use IBOutletCollection to connect multiple UIImageViews to the same outlet?
答案 2 :(得分:0)
IBOutletCollection
的问题是无法保证数组的顺序。正如在nshipster文章中提到的那样,顺序大致对应于它们在故事板中连接的顺序,但是在Xcode的不同实例中存在实例,其中没有阻止它。所以使用IBOutletCollection不是一个好主意。
相反,您应该使用IBOutletCollection和标签的组合。
@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;
viewDidLoad
或awakeFromNib
中通过IBOutletCollection数组进行迭代,并按其标记对该数组进行排序。然后您就可以使用索引访问它了。
另一种不同的策略是使用UIStackView
。如果标签垂直或水平排列,则可以将它们嵌入堆栈视图中,然后使用arrangedSubviews
数组访问标签。看起来数组的顺序与它们在堆栈视图中的排列顺序相匹配。
回应此处的评论,您可以使用一种解决方案。
struct ScoreLabels {
let view:UIView!
subscript (index:Int) -> UILabel? {
return view.viewWithTag(index) as? UILabel;
}
}
您的分数属性应该是ScoreLabels的时间。此外,它应该是computed属性,它返回通过VC视图的ScoreLabels实例。
var Score:ScoreLabels {
return ViewController.ScoreLabels(view: self.view)
}
现在您可以访问标签Score[index]
。确保您的索引从0开始。
您还可以通过直接在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
来查找标签。