iPhone SDK:切换到一个视图,然后切换回以前的查看错误

时间:2010-05-06 03:36:21

标签: iphone objective-c views

我有一个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'

所以,我有点迷失为什么它会以某种方式工作,而不是另一种方式。

2 个答案:

答案 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获得