簡體   English   中英

iPhone SDK:切換到一個視圖然后返回到先前的視圖錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM