2017-01-28 1 views
-1

Мой код работает, но я пытаюсь его понять. Это немного код, используемый для управления кнопкой «Отмена», которая может возвращаться либо из «Show» segue (отображается, когда пользователь нажимает на ячейку таблицы для редактирования), либо на «Present Modally» segue (когда пользователь нажимает кнопку " + ", чтобы добавить новую ячейку в представление таблицы). Диаграмма ниже. Я смущаюсь UINavigationController и свойством navigationController. Извиняюсь, если я пропускаю что-то очень очевидное.Быстрое понимание проблемы UINavigationController & navigationController re: presentingViewController

// Apple says below is nil if neither the current view controller nor any of its ancestors were presented modally 
let isPresentingInAddMode = presentingViewController is UINavigationController 
if isPresentingInAddMode { 
    // Modal segues need to be dismissed 
    dismiss(animated: true, completion: nil) 
} else { 
    // But Show segues are "popped" off of a stack of controllers. 
        navigationController!.popViewController(animated: true) 
} 

Вот что я, не понимая: - Если я прибыл в деталях Просмотр контроллера через «Show» Segue, пауза во время выполнения, а также опция кнопкой мыши на navigationController, Xcode говорит, что это UINavigationController ? И если я приостанавливаю выполнение внутри условия else &, используйте отладчик: po navigationController! == nil - Xcode говорит, что это оценивает значение false, поэтому navigationController является допустимым UINavigationController.

Так почему же не

presentingViewController is UINavigationController 

приравнять к истине в верхнем заявлении, когда я представил, используя «Показать»?
Возможно, я не понимаю «настоящего». Представляет что-то, что происходит только с модальными сегментами, так что нет представления в представленииViewController? И если я оглядываюсь назад на свою раскадровку (см. Диаграмму ниже), один из предков для Контроллера подробных представлений - это контроллер табличного представления, в котором встроен навигационный контроллер, содержащийся в определении Apple, представляющегоViewController, не должен: presentingViewController - это UINavigationController Будьте правдивы и в этой ситуации?

И будет:

presentingViewController != nil 

добиться того же результата, или есть важная причина, чтобы проверить presentingViewController является UINavigationController?

Большое спасибо всем, кто может помочь мне разобрать это. Джон

enter image description here

enter image description here

Segue "ShowDetail" является "Показать" переход происходящий из табличной ячейки. Сегмент «AddItem» имеет вид «Present Modally» и берется из элемента кнопки «+» добавить панель.

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    if segue.identifier == "ShowDetail" { // is this the "ShowDetail" segue? and if it is... 
     // ... get the IndexPath for the row the user clicked on (the selected row) 
     let indexPath = tableView.indexPathForSelectedRow! 
     let destinationViewController = segue.destination as! DetailViewController // downcast the destination as the specific class DetailViewController 
     // Get the to do item that the user clicked on 
     let selectedToDo = toDoArray[indexPath.row] 
     // Pass selectedToDo to the toDoItem variable in our destinationViewController 
     destinationViewController.toDoItem = selectedToDo 
    } 
} 
+0

, пожалуйста, добавьте код, где вы вызываете ViewControllers. – muescha

+0

поместите фрагменты кода снизу между двумя из этого символа: '(backtick) – muescha

+0

Привет - есть Show segue -« ShowDetail »- это его идентификатор. «AddItem» вызывается из элемента кнопки «+» добавить панель, а «ShowDetail» вызывается из ячейки представления таблицы. Я добавлю код «подготовить (для segue :) для контроллера табличного представления выше, но это не имеет значения: понимание UINavigationController и navigationController, должно ли оно? Thx – Gallaugher

ответ

2

Может быть, я не понимание «настоящего».

Возможно.Давайте сверяйтесь с таблицей:

enter image description here

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

  • Показать, ранее известный как Push. Если используется в ситуации UINavigationController, как предполагалось, вызывает pushViewController. Контроллер толкаемого вида имеет navigationController. Возврат производится по телефону popViewController.

  • Настоящее, ранее известное как Модальное. Звонки presentViewController (теперь называется present). Представленный контроллер просмотра имеет presentingViewController. Возврат выполняется по телефону dismiss.

Однако есть осложнение, которое может сбить вас с толку: если show используется не в ситуации UINavigationController, вместо вселенной взрывающейся, как и ожидалось, она волшебным образом превращается себя в present.

+0

К сожалению, люди, говорящие неофициально, очень часто говорят «присутствующие», когда они означают «push», поэтому вам нужно смотреть – matt

+0

Это было здорово! Очень полезно, поэтому у модалов всегда есть presentingViewController. Уместно ли использовать любой из этих двух операторов, чтобы проверить, является ли контроллер вида модальным? "presentingViewController! = nil" или "presentingViewController is UINavigationController"? – Gallaugher

+0

Посмотрите более внимательно на то, что я сказал. Спросив, является ли 'self.presentingViewController! = Nil', как узнать, является ли' self' представленным контроллером представления. vigationController! = nil' - как узнать, является ли 'self' толкаемым контроллером вида. - В общем, однако, вы никогда не узнаете об этом, поэтому на практике вопрос обычно не возникает. – matt

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