Iphone 情节提要正在创建my DetailViewController的多个实例
我开始使用故事板,但我注意到一个非常显著的区别:每次我来回导航时,故事板似乎都在实例化一个新的ViewController。 示例:我基于主细节模板创建了两个新的Xcode项目。在案例1中,我使用故事板,在案例2中,我使用.xib 正常情况下,我会期望这些行为相同,但它们不会 在这两个DetailViewController.m中,我添加了以下方法:Iphone 情节提要正在创建my DetailViewController的多个实例,iphone,xcode,storyboard,xib,Iphone,Xcode,Storyboard,Xib,我开始使用故事板,但我注意到一个非常显著的区别:每次我来回导航时,故事板似乎都在实例化一个新的ViewController。 示例:我基于主细节模板创建了两个新的Xcode项目。在案例1中,我使用故事板,在案例2中,我使用.xib 正常情况下,我会期望这些行为相同,但它们不会 在这两个DetailViewController.m中,我添加了以下方法: -(void)viewDidAppear:(BOOL)animated{ if (xposition ==0) { xposition=5
-(void)viewDidAppear:(BOOL)animated{
if (xposition ==0) {
xposition=50;
}else{
xposition = xposition+50;
}
NSLog(@"xposition update %d", xposition);
}
(我还将xposition声明为标头中的“int”实例变量):
当我运行故事板版本并点击“+”并在DetailViewController中导航时,我的NSLog语句会不断给我“xposition update 50”
相比之下,对于.xib版本,我得到了预期的行为,即每次进出DetailViewController时,“位置”增加50:so 50、100、150等
如何修复故事板,使其与基于.xib的版本的行为相同。具体来说,我只想实例化DetailViewController一次
编辑:回答我自己的问题。我在这方面得到了一些帮助,想发布对我有用的答案
第一次执行此步骤时,将目标viewcontroller存储在属性中(请参阅方法“PrepareForSegue”。我的VC称为MyViewController)
然后创建名为“shouldPerformSegueWithIdentifier”的委托方法,并使用该方法截取segue并为所有后续segue手动呈现存储的ViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIViewController *destination = segue.destinationViewController;
NSLog(@"identifier = %@", [segue identifier]);
if([[segue identifier] isEqualToString:@"mySegue"]) {
self.myViewController = (MyViewController*)destination;
NSLog(@"Saving myViewController for later use.");
}}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if([identifier isEqualToString:@"mySegue"]) {
if(self.myViewController != nil) {
NSLog(@"Using the saved myViewController.");
[self.navigationController pushViewController:self.myViewController animated:YES];
return NO;
}else {
return YES;
}
}
return YES;}
当您来回导航时,故事板会从DetailViewController弹出。因为它不会被其他任何东西保留,所以它将被释放,这是正常的行为 如果要保留该实例,则必须将其保留在调用它的ViewController中,并在以后再次使用。检查此问题是否有问题 编辑: 我认为你解决了这个问题,但这里有一个例子: 在界面中为viewcontroller创建属性,例如
myViewController
在prepareForSegue方法中保留viewcontroller:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
[self setMyViewController:[segue destinationViewController]];
}
这不是内存泄漏,您的示例在某些情况下可能会泄漏。看看这本指南
下次执行顺序时,请检查是否已设置属性,如果已设置,请使用它:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if([self myViewController] != nil){
[[self navigationController] pushViewController:[self myViewController] animated:YES];
return NO;
}else{
return YES;
}
}
你能说得更具体些吗?我无法使用上面提到的链接修复它。