繁体   English   中英

iPhone SDK:切换到一个视图然后返回到先前的视图错误

[英]iPhone SDK: Switching to one view then back to previous view errors

我有一个UITabBarConroller,可用于在3个不同的视图之间切换。 所有这一切都完美。 在我的其中一个标签上,我在处添加了一个名为“添加”的按钮,为此添加了一个出口,以及一个类似于以下内容的IBAction方法:

// Method used to load up view where we can add a new ride
- (IBAction)showAddNewRideView {    

    MyRidesViewController *controller = [[MyRidesViewController alloc] initWithNibName:@"AddNewRide" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:controller animated:YES];
    [controller release];

}//end showAddNewRideView

目前,这工作正常,并加载了我的AddNewRide nib文件。 但是,一旦加载了该视图,我就会有一个取消按钮,单击该按钮后,我想返回上一个视图。 因此,我想我将使用以下方法加载上面的笔尖,而做与上述相反的操作:

- (IBAction)cancelAddingNewRide {
    MyRidesViewController *controller = [[MyRidesViewController alloc] initWithNibName:@"MainWindow" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:controller animated:YES];
    [controller release];

}//end cancelAddingNewRide

但是,尝试加载MainWindow笔尖时,程序崩溃了,并且出现以下错误:

2010-05-05 20:24:37.211 Ride[6032:207] *** -[MyRidesViewController cancelAddingNewRide]: unrecognized selector sent to instance 0x501e450
2010-05-05 20:24:37.213 Ride[6032:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[MyRidesViewController cancelAddingNewRide]: unrecognized selector sent to instance 0x501e450'

因此,我对它为什么会以一种方式而不是另一种方式起作用感到有些困惑。

首先,我想解决部分错误:将您的视图视为堆栈。 当您“推”模态控制器时,您正在将该视图添加到堆栈中。 旧的视图仍然在下面。 因此,您需要“弹出”模态视图以返回到旧视图。 如果按一个新视图,则现在堆栈中有3个视图,它们全部占用内存,实际上只需要一个。

因此,在cancelAddingNewRide内部,只需尝试:

[super dismissModalViewControllerAnimated:true];

您可能还有其他导致崩溃的问题,但这通常可以使事情正常进行。

通常,当我使用presentModalViewController时,所呈现的viewController告诉调用viewController的方法是使用dismissModalViewControllerAnimated:YES;将其关闭。

因此,换句话说,在cacncelAddingNewRide中,您只需调用其中具有showAddnewRideView的类,并将其自身传递给该方法。

很难解释,但我将向您展示一个示例:

cancelAddingNewRide类:

- (IBACtion)home:(id)sender {
    if (self.delegate respondsToSelctor:@selector(dismiss:)]) {
        [self.delegate dismiss:self];
    }
}

然后在showAddNewRideView类中

-(void) dismiss:(cancelAddingNewRide_class *) controller {
     [self dismissModalViewControllerAnimated:Yes];
}

希望这对错别字有意义

编辑:哦,让控制器的代表自我

controller.delegate = self;

实际上,要考虑的更多。 您必须将调用的viewController定义为Delegate。 看看斯坦福大学的iPhone讲座,第11讲涉及此内容,可以从iTunesU上获得

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM