在 for 语句中创建 ViewController 并更改 属性

create ViewController and change property in for statement

我创建 MyViewController 并使用 for 语句索引更改 属性。
在下面的代码中,NSLog 输出 case0case1case2
但是,myViewController 始终是 redColorNSLog 输出 firstfirstfirst

如何修复 for statementmyVC 的 属性?

ViewController.m

for (int i = 0; i < 3; i++) {
        MyViewController* myVC = [[MyViewController alloc]init];
        myVC.view.frame = CGRectMake(0 + _scrollView.frame.size.width * i, 0, _scrollView.frame.size.width, _scrollView.frame.size.height);
        switch (i) {
            case 0:
                myVC.state = STATE_FIRST;
                NSLog(@"case0");
                break;
            case 1:
                myVC.state = STATE_SECOND;
                NSLog(@"case1");
                break;
            case 2:
                myVC.state = STATE_THIRD;
                NSLog(@"case2");
                break;
            default:
                break;
        }
        [_scrollView addSubview:myVC.view];
    }

MyViewController.h

typedef enum : NSInteger {
    STATE_FIRST = 0,
    STATE_SECOND,
    STATE_THIRD,
} State;

@property (nonatomic) State state;

我的ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    switch (_state) {
        case STATE_FIRST:
            self.view.backgroundColor = [UIColor redColor];
            NSLog(@"first");
            break;
        case STATE_SECOND:
            self.view.backgroundColor = [UIColor blueColor];
            NSLog(@"second");
            break;
        case STATE_THIRD:
            self.view.backgroundColor = [UIColor yellowColor];
            NSLog(@"third");
            break;
        default:
            break;
    }
}

问题是您在设置视图控制器的状态之前访问了视图控制器的视图。在 switch 语句之后设置视图控制器的框架。

for (int i = 0; i < 3; i++) {
    MyViewController* myVC = [[MyViewController alloc]init];
    switch (i) {
        case 0:
            myVC.state = STATE_FIRST;
            NSLog(@"case0");
            break;
        case 1:
            myVC.state = STATE_SECOND;
            NSLog(@"case1");
            break;
        case 2:
            myVC.state = STATE_THIRD;
            NSLog(@"case2");
            break;
        default:
            break;
    }
    myVC.view.frame = CGRectMake(0 + _scrollView.frame.size.width * i, 0, _scrollView.frame.size.width, _scrollView.frame.size.height);
    [_scrollView addSubview:myVC.view];
}

换句话说,调用 myVC.view 访问视图控制器的视图。这反过来导致 viewDidLoad 被调用。由于 viewDidLoad 在您设置状态之前被调用,因此即使后来正确设置了状态,您的所有视图控制器最终都以红色背景结束。

顺便说一句 - 您可能还有另一个严重的问题。您将视图控制器的视图添加到滚动视图,但视图控制器本身在每个 for 循环迭代结束时被释放。你真的应该保持对每个视图控制器的强引用。更好的是,将主视图控制器正确设置为容器视图控制器。请参阅 UIViewController 文档的 "Implementing a Container View Controller" 部分。

当你调用myVC.view.frame时,myVC.view会调用viewDidLoad,然后myVC.state不会让viewDidLoad中的代码执行。你可以设置断点来检查这个。

如果你想改变状态来改变颜色,你可以重写 MyViewController 中的 setState 方法,如下所示: MyViewController.m

- (void)setState:(State)aState
{
    _state = aState;
    switch (_state) {
        case STATE_FIRST:
            self.view.backgroundColor = [UIColor redColor];
            NSLog(@"first");
            break;
        case STATE_SECOND:
            self.view.backgroundColor = [UIColor blueColor];
            NSLog(@"second");
            break;
        case STATE_THIRD:
            self.view.backgroundColor = [UIColor yellowColor];
            NSLog(@"third");
            break;
        default:
            break;
    }

}