在ViewController
我有以下内容:
- (void)viewWillAppear:(BOOL)animated
{
DataObject *theDataObject = [self theAppDataObject];
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"MMM dd, yyyy HH:mm"];
NSString *dateStr = [formatter stringFromDate:theDataObject.deadline];
NSLog(@"Logged dateStr: %@", dateStr);
[dateTimeLabel setText:dateStr];
[super viewWillAppear:animated];
}
澄清:dateTimeLabel
IS 已连接到xib
文件中。 viewWillAppear
方法是从另一个ViewController
显式调用的,并且正在触发,如下所示:
- (IBAction)setDateTimeButtonClicked:(id)sender
{
DataObject *theDataObject = [self theAppDataObject];
theDataObject.deadline = [datePicker date];
FirstMobileViewController *mobileVC = [[FirstMobileViewController alloc] init];
[mobileVC viewWillAppear:YES];
[mobileVC release];
[UIView transitionWithView:self.view.superview
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowAnimatedContent
animations:^{[self.view removeFromSuperview];}
completion:NULL];
}
viewWillAppear
方法正在触发 - 再次显示超级视图时,dateStr
会NSLog
正确记录dateTimeLabel
。但NSLog
永远不会更新。显然,对NSLog
行进行评论并没有什么不同。
MADDENING 是即使dateStr
记录dateStr
就好了,如果我将@"Yo!"
更改为,例如, dateTimeLabel
甚至是本地初始化的字符串,然后{{1}}会更新,没问题。
我在这里缺少什么?
答案 0 :(得分:3)
添加子视图控制器的方法不正确。尝试使用以下代码(使用您的方法,当您调用ViewWillAppear时,请认为视图控制器的视图尚未初始化。(您通过简单的黑客检查:在mobileVC初始化之后添加mobileVC.view;
)
- (IBAction)setDateTimeButtonClicked:(id)sender {
DataObject *theDataObject = [self theAppDataObject];
theDataObject.deadline = [datePicker date];
FirstMobileViewController *mobileVC = [[FirstMobileViewController alloc] init];
[self addChildViewController:mobileVC];
UIView *superView = self.view.superview;
mobileVC.view.frame = superView.bounds;
[UIView transitionWithView:superview
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowAnimatedContent
animations:^{[self.view removeFromSuperview];
[superview addSubView:mobileVC.view]}
completion:^(BOOL finished) {
[mobileVC didMoveToParentViewController:self];
}];
}
使用此方法,应自动调用viewWillAppear。
答案 1 :(得分:0)
首先,你在使用它之前发布mobileVC
,所以当它运行viewWillAppear:
方法中的代码时,就会发生这一切。
您还没有加载mobileVC
的XIB文件,因为您只有alloc
和init
。因此,您在viewWillAppear
中引用的对象很可能在您明确调用该方法时不存在。
您没有显示用于呈现mobileVC
的代码,因此很难猜测修复将会是什么,或者了解您在使用字符串文字时遇到的奇怪问题。但是,足以说明,当您呈现新的视图控制器时,它将与您明确调用的实例不同。
可能的解决方法:
initWithNibName:bundle:
代替普通init
,以确保您的XIB
已加载。然后将mobileVC
传递到转换的完成块以显示它?答案 2 :(得分:0)
将[super viewWillAppear:animated]放在viewWillAppear的开头。
也许你永远不会将xib中的dateTimeLabel连接到dateTimeLabel。
尝试使用[self。 dateTimeLabel setText:dateStr]