在 for 语句中创建 ViewController 并更改 属性
create ViewController and change property in for statement
我创建 MyViewController
并使用 for 语句索引更改 属性。
在下面的代码中,NSLog
输出 case0
、case1
和 case2
。
但是,myViewController
始终是 redColor
,NSLog
输出 first
、first
和 first
。
如何修复 for statement
中 myVC
的 属性?
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;
}
}
我创建 MyViewController
并使用 for 语句索引更改 属性。
在下面的代码中,NSLog
输出 case0
、case1
和 case2
。
但是,myViewController
始终是 redColor
,NSLog
输出 first
、first
和 first
。
如何修复 for statement
中 myVC
的 属性?
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;
}
}