2010-05-06 70 views
1

我有一个UITabBarConroller,我用它来切换3个不同的视图。这一切都完美。在我的标签之一,我在添加一个按钮,所谓的“添加”,我增加了一个出口这一点,以及它看起来像下面的IBAction为方法:iPhone SDK:切换到一个视图,然后回到以前的视图错误

// 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 

但是,它试图加载主窗口笔尖,程序崩溃,我也得到出现以下错误:

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

首先,我想解决部分错误:将您的视图看作一个堆栈。当您“推”模式控制器时,您将该视图添加到堆栈。旧的观点仍然存在。因此,您需要从模式视图中“弹出”以返回到旧视图。如果你推新视图,你现在有3个视图都在占用内存,你真的只需要一个视图。

因此,内cancelAddingNewRide只是尝试:

[super dismissModalViewControllerAnimated:true]; 

您可能正在导致崩溃等问题,但这通常应该把事情的工作。

+0

这是事实,但不是推荐的方法。当前的viewController不应该自行解散,调用它的类应该解雇它 – Rudiger 2010-05-06 04:57:25

+0

Apple的文档说:“父视图控制器负责解除它使用presentModalViewController:animated:方法呈现的模式视图控制器。但是,如果您在模态视图控制器本身上调用此方法,则模式视图控制器会自动将消息转发给其父视图控制器。“虽然模态控制器不负责任,但并不表示它不应该自行解散。请问苹果是否在其他地方记录这个文件? – 2010-05-06 05:18:43

+0

Yay!这绝对有效,并解决了我的问题。但是,你看到这不是一个好方法吗? – 2010-05-06 05:33:53

0

通常,当我使用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]; 
} 

希望是有道理的和SOZ错别字

编辑:哦,并使控制器的委托选择f

controller.delegate = self; 

其实想到这件事还有更多。您必须将被调用的viewController定义为Delegate。看看斯坦福大学的iPhone讲座,第11讲与此有关,并可从iTunesU

相关问题