我有一个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'
所以,我有点迷失为什么它会以某种方式工作,而不是另一种方式。
答案 0 :(得分:3)
首先,我想解决部分错误:将您的视图视为堆栈。当您“推”模态控制器时,您将该视图添加到堆栈中。旧视图仍在下面。因此,您需要从模态视图中“弹出”以返回旧视图。如果你打开一个新的视图,你现在在堆栈上有3个视图,它们都占用内存,你真的只需要一个。
所以,在cancelAddingNewRide里面试试:
[super dismissModalViewControllerAnimated:true];
您可能还有其他问题导致崩溃,但这通常可以解决问题。
答案 1 :(得分:0)
通常当我使用presentModalViewController时,呈现的viewController告诉调用viewController使用dismissModalViewControllerAnimated来解除它:是;
所以换句话说,在cacncelAddingNewRide中,你只需要调用其中有showAddnewRideView的类,并让它自己传递给方法。
很难解释但是Ill给你一个例子:
cancelAddingNewRide class:
- (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获得