Swift - Ссылка viewControllers в navigationController по номеру индекса
Этот код иллюстрирует то, что я спрашиваю:
Для простого приложения с двумя экранами rootViewController
и TableViewController
, rootVC
будет по индексу [0] в navigationController
, следующие просмотры будут увеличивать индекс на 1
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let navController = self.window?.rootViewController as! UINavigationController
let firstViewController = navController.viewControllers[0] as! firstViewController
firstViewController.managedObjectContext = self.managedObjectContext
return true
}
Сейчас я пытаюсь пройти managedObjectContext
от appDelegate
к ViewControllers за rootViewController
:
В центре вид rootViewController
Хочу пройти managedObjectContext
на экраны рядом, выше и ниже.
Я пытался передать его от appDelegate
в rootViewController
затем переходя от rootViewController
к следующим представлениям, но это не работает.
Кто-нибудь, скажите, пожалуйста, как узнать порядковые номера представлений, следующих за тем же представлением? Спасибо!
2 ответа
Теперь я пытаюсь передать managedObjectContext из appDelegate в ViewControllers за rootViewController
Ты не можешь Вся идея не имеет смысла. Во время выполнения кода в делегате приложения эти контроллеры представления еще не существуют. Раскадровка - это просто набор инструкций для создания будущих экземпляров контроллеров представления; во время таких случаев application:didFinishLaunchingWithOptions:
- за исключением первого, которое вы явно делаете прямо в своем коде.
Вместо этого каждый из этих контроллеров представления должен получить managedObjectContext
от делегата приложения, в своем собственном коде (например, их viewDidLoad
). Это то, что они все могут легко сделать, потому что делегат приложения имеет managedObjectContext
свойство, и все они могут видеть это свойство, потому что все они могут видеть делегат приложения (потому что это общее приложение delegate
).
Я не совсем согласен с ответом выше из-за того факта, что считается плохой практикой получать делегат вашего приложения от контроллеров представления или любого другого объекта в этом отношении только для того, чтобы получить его сохраненные свойства.
Что вы можете сделать, это использовать концепцию внедрения зависимостей, чтобы передать managedObjectContext вдоль ваших контроллеров представления, когда вы перемещаетесь вниз по иерархии представления, используя prepareForSegue
метод, если вы выполняете переход или назначаете его следующему контроллеру представления, если вы создаете его и программно помещаете его в стек навигации.
// App delegate: - didFinishLaunchingWithOptions
let navCon = window?.rootViewController as? UINavigationController
let rootVC = navCon?.viewControllers.first as? firstViewController
rootVC?.managedObjectContext = managedObjectContext
// FirstViewController: - Using segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
guard let identifier = segue.identifier else { return }
switch identifier {
case "SecondView":
let navCon = segue.destinationViewController as? UINavigationController
let controller = navCon?.topViewController as? SecondViewController
controller?.managedObjectContext = self.managedObjectContext
default:
break
}
}
// FirstViewController: - Pushing programmatically
let controller = SecondViewController()
controller.managedObjectContext = self.managedObjectContext
navigationController?.pushViewController(controller, animated: true)