Как показать кнопку на RootViewController UINavigationController?

Вот мой код. Я хочу поместить кнопку возврата на открытие rootviewController.

- (void)selectSurah:(id)sender {

    SurahTableViewController * surahTableViewController = [[SurahTableViewController alloc] initWithNibName:@"SurahTableViewController" bundle:nil];
    [email protected]"Surah";

    s[email protected]"Back";

    UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:surahTableViewController];

    [self presentModalViewController:aNavigationController animated:YES];   
}

Ответ 1

Я не считаю возможным вывести контроллер корневого представления из стека навигации, но вы можете подделать его с помощью UIButton, добавленного как пользовательский вид UIBarButtonItem:

UIButton *b = [[UIButton alloc]initWithButtonType:UIButtonTypeCustom];
[b setImage:[UIImage imageNamed:@"BackImage.png"] forState:UIControlStateNormal];
[b addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
self.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:b];

Подходящий PSD элементов интерфейса iOS можно найти здесь.

Ответ 2

Faizan,

комментарий Helium3 имеет смысл.

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

Если это так, вы можете просто создать новый UIBarButtonItem и установить левую (или правую) кнопку для UINavigationController navigationItem. Чтобы не разбить инкапсуляцию, создайте ее в методе viewDidLoad для вашего контроллера SurahTableViewController.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // make attention to memory leak if you don't use ARC!!!
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
           style:UIBarButtonItemStyleBordered
             target:self
             action:@selector(close:)];
}

-(void)close:(id)sender
{
    // to dismiss use dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
    // dismissModalViewControllerAnimated: is deprecated

    [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"controller dismissed"); }];
}

Ответ 3

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

[self dismissModalViewControllerAnimated:YES];

Ответ 4

Внешний вид и поведение кнопки "Назад" в UINavigationController зависит от взаимодействия между стеком UINavigationControllers. Помещение кнопки возврата на первом контроллере нарушает это соглашение, туда нечего возвращаться, поэтому ваш код не работает.

Вам нужно будет вручную добавить UIBarButtonItem к штрих-коду заголовка, например:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];

Если вы действительно хотите, чтобы он выглядел как кнопка "Назад" , вам нужно вручную создать UIBarButtonItem с изображением, которое отражает кнопку "Назад" .

Другое предложение, хотя похоже, что вы пытаетесь использовать кнопку "Назад" , чтобы отклонить контроллер модального представления, я бы придерживался чего-то более обычного, как кнопка "Закрыть" или "Готово", чтобы закрыть контроллер модального представления, Кнопка "Назад" действительно более подходит для навигации по стеку UINavigationControllers.