iPhone SDK: переключение на один просмотр и возврат к предыдущим ошибкам просмотра - PullRequest
1 голос
/ 06 мая 2010

У меня есть 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. Но как только этот вид загружается, у меня появляется кнопка отмены, которую я нажимаю, чтобы вернуться к предыдущему виду. Итак, я решил сделать обратное, используя следующий метод, который загрузит мой предыдущий перо:

- (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 ]

3 голосов
/ 06 мая 2010

Во-первых, я хотел бы устранить часть ошибки: думать о ваших представлениях как о стеке. Когда вы «проталкиваете» модальный контроллер, вы добавляете это представление в стек. Старый вид все еще там внизу. Так что вам нужно «выскочить» из модального вида, чтобы вернуться к старому виду. Если вы активируете новое представление, у вас теперь есть 3 представления в стеке, которые все занимают память, где вам действительно нужен только один.

Итак, внутри cancelAddingNewRide просто попробуйте:

[super dismissModalViewControllerAnimated:true];

У вас могут быть другие проблемы, вызывающие сбой, но обычно это должно работать.

0 голосов
/ 06 мая 2010

Как правило, когда я использовал 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 как делегат. Взгляните на лекции iPhone в Стэнфордских университетах, лекция 11 посвящена этому и доступна на iTunesU .

...