Iphone 情节提要正在创建my DetailViewController的多个实例

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

我开始使用故事板,但我注意到一个非常显著的区别:每次我来回导航时,故事板似乎都在实例化一个新的ViewController。 示例:我基于主细节模板创建了两个新的Xcode项目。在案例1中,我使用故事板,在案例2中,我使用.xib

正常情况下,我会期望这些行为相同,但它们不会

在这两个DetailViewController.m中,我添加了以下方法:

-(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;
    }
}

你能说得更具体些吗?我无法使用上面提到的链接修复它。