2012-03-21 7 views
1

У меня есть две программно созданные кнопки, которые вы можете увидеть в моем методе viewDidLoad. В модальном окне у меня есть кнопка, которая вызывает метод cancelSearch через делегат. Когда я помещаю точку останова на метод cancelSearch, она попадает, поэтому я знаю, что мой делегат настроен правильно, но даже если он вызывает эту строку [self rejectViewControllerAnimated: YES complete: nil]; это фактически не закрывает модальное окно.Модальное окно не увольняется

Код, приведенный ниже, представлен на основном экране контроллера.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIBarButtonItem *actionButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showActionMenu:)]; 
    actionButton.style = UIBarButtonItemStyleBordered; 

    UIBarButtonItem *searchButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(showSearchMenu:)]; 
    searchButtonItem.style = UIBarButtonItemStyleBordered; 

    UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; 
    NSArray* buttons = [NSArray arrayWithObjects:actionButton, searchButtonItem, nil]; 
    [toolbar setItems:buttons animated:NO]; 
    self.navigationItem.title = @"Census Management"; 
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar]; 


    [[RKClient sharedClient] get:@"censusmanagement" delegate:self]; 
} 

- (IBAction)showActionMenu:(id)sender 
{ 
    [self performSegueWithIdentifier: @"CMActionSegue" sender: self]; 
} 

- (IBAction)showSearchMenu:(id)sender 
{ 
    ehrxCMSearchView *search = [[self storyboard] instantiateViewControllerWithIdentifier:@"cmSearch"]; 
    search.selectedOptions = self.selectedOptions; 

    search.delegate = self; 

    [self.navigationController pushViewController:search animated:YES]; 
} 

- (void)cancelSearch:(ehrxCMSearchView *)controller 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

ответ

4

Вы уволит вид модального используя что-то похожее на:

[self dismissModalViewControllerAnimated:YES]; 

Это уволят модальный вид, который был загружен с использованием чего-то подобного:

[self presentModalViewController:search animated:YES]; 

глядя на фрагменте кода, то появляется контроллер вида поиска выталкивается на навигационной стеку, используя следующую строку:

[self.navigationController pushViewController:search animated:YES]; 

Так что вам, вероятно, нужно вытолкнуть вид из навигации стеки, а не пытаться уволить его в виде модальности:

[self.navigationController popViewControllerAnimated:YES]; 
+0

Я думаю, что ты прав. Я изменил его, потому что я передавал его данные. Так что, как я это делаю, я думаю, что это даже действительно модальный вид. Поскольку у меня настроен мой делегат, могу ли я сделать это с главного контроллера? Ваша последняя строка выглядит так, как будто я буду выполнять это из нового представления, которое я показываю. – Jhorra

+0

Думая об этом больше, я предполагаю, что, поскольку я выдвигаю представление вместо того, чтобы рассматривать его как модальный, я должен просто передать данные обратно на главный контроллер и сразу же вызвать функцию обратной связи вручную? – Jhorra

+0

@Jhorra Вы можете вызвать -popViewControllerAnimated: либо из главного контроллера представления, либо из нового контроллера представления, поскольку они (теоретически) должны использовать тот же UINavigationController. Для модальных просмотров вам нужно будет вызвать -dismissModalViewControllerAnimated из представления, которое представило контроллер модального представления (скорее всего, ваш главный контроллер представления). –

0

Если ваш контроллер представления модально представлен, вы должны использовать это:

[self.presentingViewController dismissModalViewControllerAnimated:YES]; 

Свойство presentingViewController доступен только прошивкой 5. Итак, если вы ориентируетесь на более старые версии iOS, вы должны вместо этого использовать self.parentViewController (используйте соответствующий для каждой версии iOS, вы должны это обработать).

Если вы сделаете этот контроль в ваших родителей/представление вида контроллера, а затем просто назвать это:

[self dismissModalViewControllerAnimated:YES]; 
+0

От других людей, которые сказали мне, что использование делегата является предпочтительным, поэтому я пытаюсь это сделать. Это также помогает, потому что я хочу передать данные с модального контроллера обратно на главный контроллер. – Jhorra

+0

Оба метода были обесценены в iOS 6.0. – Zorayr

Смежные вопросы