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