[英]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.