La risposta di @PeterOettl alla sua stessa domanda mi ha messo sulla strada giusta ed è fantastico per questo. Quindi il merito è di lui.
mi hanno quasi la stessa struttura storyboard come lui, ma come vc
è una navigationController
ottengo un errore di runtime dicendo
'Spingendo un controller di navigazione non è supportato'
Come detto, questo perché vc
è il navigationController
della vista di dettaglio e non il viewController della vista di dettaglio.
Nota che mi sorprende che @PeterOettl non ottenga quell'errore anche nel suo caso, poiché il passaggio indicato nell'immagine dello storyboard punta al controller di navigazione della vista di dettaglio.
Pertanto il codice desidero che (Swift) semplicemente aggiungendo
let detailViewControllerNavigationController = (vc as UINavigationController).viewControllers[0] as UIViewController
e spingendo detailViewControllerNavigationController
anziché vc
e l'intero codice è
func splitViewController(splitViewController: UISplitViewController, showDetailViewController vc: UIViewController, sender: AnyObject?) -> Bool {
println("UISplitViewController collapsed: \(splitViewController.collapsed)")
if (splitViewController.collapsed) {
let master = splitViewController.viewControllers[0] as UITabBarController
let masterNavigationController = master.selectedViewController as UINavigationController
let detailViewControllerNavigationController = (vc as UINavigationController).viewControllers[0] as UIViewController
masterNavigationController.pushViewController(detailViewControllerNavigationController, animated: true)
return true
} else {
return false
}
}
noti inoltre che questo codice viene inserito nello AppDelegate.swift
dell'esempio master-detail di Xcode in cui viene aggiunta una barra delle schede nella vista principale.
EDIT
Nei commenti che abbiamo discusso con @PeterOettl della differenza tra .pushViewController
e .showViewController
.
documentazione Apple dice:
showViewController: mittente:
Questo metodo spinge un nuovo View Controller nello stack di navigazione in maniera simile a come la pushViewController: animato: metodo. È possibile chiamare questo metodo direttamente se lo si desidera, ma in genere questo metodo viene chiamato da altrove nella gerarchia del controller di visualizzazione quando è necessario visualizzare un nuovo controller di visualizzazione .
Disponibile in iOS 8.0 e versioni successive.
Ho esattamente lo stesso storyboard e il problema, e la tua risposta mi ha avvicinato un po 'all'obiettivo. Tuttavia, splitViewController: showDetailViewController: sender: delegate viene attivato una sola volta per me ... i successivi "shows" non attivano il delegato. Cosa hai finito con l'assegnazione come delegato? – Fozzle
Ulteriori indagini mostrano che il mio delegato splitView viene riassegnato dopo la navigazione. Se capisco perché aggiornerò. – Fozzle
Questa soluzione non funzionerà per iPhone 6 +. Avvia la tua app in verticale, vai alla visualizzazione dei dettagli. Quindi passare al paesaggio, sia i dettagli che le viste principali mostreranno la vista di dettaglio. –