Подтвердить что ты не робот

Отменить разворот кнопкой навигации

Я просмотрел демонстрационное видео для 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

4b9b3361

Ответ 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

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

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