Отменить разворот кнопкой навигации
Я просмотрел демонстрационное видео для Apple по реализации раскадровки с секцией размотки segues и увидел демо с использованием пользовательских кнопок на главном экране. Это прекрасно работает.
Я также видел хороший пример того же самого, что и здесь. http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues
Тем не менее, я хочу, чтобы обычный push segue передавался от родителя (с данными основной формы) к дочернему (с дополнительными параметрами настроек), а затем возвращался к родительскому контроллеру представления с помощью кнопки "Назад" на панели навигации, а не с помощью пользовательская кнопка в представлении, как показано в демонстрации. Затем родительский контроллер сохранит все на сервере API, когда нажата дополнительная кнопка сохранения на родительском контроллере.
Кажется, я не могу переопределить кнопку навигации назад, чтобы указать ее на мое действие unind segue, а так как кнопка back не появляется на раскадровке, я не могу перетащить на нее зеленую кнопку выхода
Я попробовал это в viewDidLoad, чтобы переопределить действие, но он не работал
[self.navigationItem.backBarButtonItem setAction: @selector (unindSegueAction:)];
Можно ли разблокировать кнопку push с помощью кнопки "Назад" ?
Лучшей идеей, которую я имел до сих пор, было переопределить кнопку "Назад" из метода viewDidLoad, но это устраняет стиль кнопки наклонной кнопки назад, а также кажется грубым взломом простой проблемы.
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(unwindSegue:)];
Я знаю, что есть ответы на использование протокола и делегатов, но я заинтересован в использовании метода разворачивания Xcode4.5
Ответы
Ответ 1
В конце концов, мне не нужно было раскручивать сеанс, поскольку я все еще мог получить ссылку на методы родительского контроллера, следуя контроллеру навигации.
Мне удалось получить ссылку, выполнив следующее в методе - (void)viewWillDisappear:(BOOL)animated
дочернего контроллера
NSInteger currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
FirstViewController *parent = (FirstViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];
parent.barcodeType = indexPath.row;
который отлично переместил переменную настроек обратно в исходный контроллер.
Я также добавил ссылку на импорт родительского контроллера в верхней части childcontroller
Ответ 2
@Alan находится на правильном пути. Просто добавьте тест, чтобы предотвратить переключение segue, когда он не возвращается к первому контроллеру представления. Что-то вроде этого в viewWillDisappear фактически позволит вам выполнить разматывание для кнопки "Назад". Вам нужно будет создать ручную размотку, перетаскивая ее из класса вниз до значка выхода. Обязательно укажите его после создания.
UIViewController *vc = self.navigationController.topViewController;
if ([FirstViewController class] == [vc class])
{
[self performSegueWithIdentifier:@"unwindSegue" sender:self];
}
Ответ 3
Я хотел бы добавить решение Swift, которое следует за предложением @Chuck H выше:
let rootVC = self.navigationController!.topViewController
if rootVC.isKindOfClass(TheNameOfYourViewController) {
performSegueWithIdentifier("yourNamedSegueIdentifier", sender: self)
}
Ответ 4
Альтернативой, которую вы, возможно, не рассматривали, является предоставление родительскому элементу дочернего элемента дочернего элемента и использование методов делегата в дочернем файле для обновления родителя.
Таким образом, вы обойдете необходимость добавления к навигации, потому что родитель уже обновлен в тот момент, когда вы нажмете назад.