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)
Другие вопросы по тегам