Objective c 尽管有'addObject',NSMutableArray.count还是为1

Objective c 尽管有'addObject',NSMutableArray.count还是为1,objective-c,nsmutablearray,arc4random,Objective C,Nsmutablearray,Arc4random,通过-addLabel添加四个\u labelView后,我想通过-moveLabel随机移动所有\u labelView LabelView是UIView的子类。 但如果是此代码,我只能移动最后添加的一个\u labelView。 查看NSLog(@“%d”,_viewsArray.count),它输出“1”。 如何修复它以移动所有\u labelView? @property (nonatomic, strong) LabelView* labelView; @property (nonat

通过
-addLabel
添加四个
\u labelView
后,我想通过
-moveLabel
随机移动所有
\u labelView
LabelView是UIView的子类。

但如果是此代码,我只能移动最后添加的一个
\u labelView

查看NSLog(@“%d”,_viewsArray.count),它输出“1”。
如何修复它以移动所有
\u labelView

@property (nonatomic, strong) LabelView* labelView;
@property (nonatomic, strong) NSMutableArray* viewsArray;

- (void)addLabel
{
    _viewsArray = [[NSMutableArray alloc]init];
    _labelView = [[LabelView alloc]initWithFrame:CGRectMake(0, 0, 200, 25)];
    [_viewsArray addObject:_labelView];
    for (_labelView in _viewsArray){
        [self.view addSubview:_labelView];
    }
    NSLog(@"%d", _viewsArray.count);
}

- (void)moveLabel
{
    int n;
    CGPoint labelFrame;
    for (_labelView in _viewsArray)
    {
        n = arc4random() % 4;
        switch (n) {
            case 0: labelFrame = CGPointMake(30, 50);
                break;
            case 1: labelFrame = CGPointMake(30, 100);
                break;
            case 2: labelFrame = CGPointMake(30, 150);
                break;
            case 3: labelFrame = CGPointMake(30, 200);
                break;
            default:
                break;
        }
        [UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveEaseIn
                         animations:^{_labelView.center = labelFrame;} completion:^(BOOL finished){}];
    }
    NSLog(@"%d", _viewsArray.count);
}


每次调用addView时,您都在分配一个新的_viewsArray!
您应该在viewDidLoad或其他位置分配数组,然后使用它

每次调用addView时,您都在分配一个新的\u viewsArray!
您应该在viewDidLoad或其他位置分配数组,然后在addLabel方法中使用它,每次添加新标签时都分配NSMutableArray:

_viewsArray = [[NSMutableArray alloc]init];
因此,在该数组中只有一个对象。
只需将此行移动到viewDidLoad方法(或者如果不是view controller子类,则移动到某个init方法),它就会修复该问题。

在addLabel方法中,每次添加新标签时,您都会分配NSMutableArray:

_viewsArray = [[NSMutableArray alloc]init];
因此,在该数组中只有一个对象。 简单地将这一行移动到viewDidLoad方法(或者如果它不是view controller子类,则移动到某个init方法),它应该会修复它。

最简单的修复

- (void)addLabel {
    if (_viewsArray == nil) {
        _viewsArray = [[NSMutableArray alloc] init];
    }
最简单的修复

- (void)addLabel {
    if (_viewsArray == nil) {
        _viewsArray = [[NSMutableArray alloc] init];
    }

每当您调用
addLabel
时,您正在创建一个新的空可变数组…您在创建的每个数组中只能放置一个元素。此外,在您解决该问题后,addLabel代码会将其所有标签重新添加到self.view。不要在add上循环该数组。每当调用
addLabel
时,您将创建一个新的空可变数组…您在创建的每个数组中只放置一个元素。此外,解决该问题后,addLabel代码将把它的所有标签重新添加到self.view。不要在add上循环该数组。