通过UINavigationController将数据传递到UIViewController

时间:2018-07-06 20:36:01

标签: uinavigationcontroller swift4

当用户选择了某个项目时,我正在尝试将所选项目的索引以及对记录控制器的引用传递给UINavigationController我遇到的问题是我不确定如何正确传递这些变量。我试图避免通过“错误的方式”。 [编辑:如果我将项目保存在AppDelegate ]中的静态变量中,则该应用程序将正常运行

下面,我显示用户选择项目时运行的代码,在导航控制器中运行的代码(使用错误的方式传递变量)以及最后在视图控制器上运行的代码(指示变量未传递。

这是用户选择项目时的代码:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

  guard let storyboard = storyboard, let controller = storyboard.instantiateViewController(withIdentifier: "DetailNavigationController") as? DetailNavigationController else {
    print("ERROR: didn't get the view controller we expected")
    return
  }

  print("initializing the newly created page view controller with index \(indexPath.row)")

  controller.bIndexPath = indexPath
  controller.bController = bController
  present(controller, animated: true, completion: nil)
}

这将导致DetailNavigationController.viewDidLoad()运行:

override func viewDidLoad() {
  super.viewDidLoad()
  print("DetailNavigationController vdl and index \(bIndexPath.row)")
  guard let storyboard = storyboard, let controller = storyboard.instantiateViewController(withIdentifier: "ManagePageViewController") as? ManagePageViewController else {
    print("ERROR: didn't get the view controller we expected")
    return
  }
  controller.bIndexPath = bIndexPath
  controller.bController = bController
} 

的输出证明数据正在传递至此:

DetailNavigationController vdl and index 4

但是在ManagePageViewController中,我们显然没有得到相同的实例,因为未设置变量。我“知道这行不通”,但不知道还能尝试什么。

所以下面我们看到ManagePageViewController.viewDidLoad():

override func viewDidLoad() {
  super.viewDidLoad()
  print("viewDidLoad ManagePageViewController \(bIndexPath)")
  if let viewController = viewPhotoCommentController(currentIndex ?? 0) {

    if let bController = bController {
      viewController.bController = bController
    } else {
      print("ManagePageViewController viewDidLoad bController.performFetch")
      let bSortedByName = SaucerItem.order(Column("name").asc, Column("name"))
      bController = try! FetchedRecordsController(dbQueue, request: bSortedByName)
      try! bController.performFetch()
      vController.brewController = bController
    }



    let viewControllers = [viewController]
    print("setting a view controller instance with currentIndex \(currentIndex ?? 0)" )
    setViewControllers(viewControllers, direction: .forward, animated: false, completion: nil)
  }
  dataSource = self
}

以及显示制作新bController的输出的输出:

viewDidLoad ManagePageViewController nil
ManagePageViewController initializing the newly created page view controller with index 0
ManagePageViewController viewDidLoad bController.performFetch
setting a view controller instance with currentIndex 0

这表明先前设置的变量一定在其他实例上,所以这是错误的方法。

我以为我可以在AppDelegate中进行设置,但这对我来说似乎是错误的。必须有一种干净地传递数据的方法。我尝试过的其他一些事情包括使用UINavigationController中包含的功能来确定它将要运行的内容,并在该实例上设置变量,但是我无法发现控制器将要运行的实例。运行。

其他信息:

为了回答一个问题,为什么我似乎要从“ A”到“ C”到“ B”,我将在此处放置一个图表并尝试解释原因。最重要的是,必须以这种方式配置它才能在详细信息屏幕上启用分页。

storyboard layout

从DetailNavigationController.viewDidLoad()打印controllerManagePageViewController,从ManagePageViewController.viewDidLoad()打印viewControllerPageViewController

那么将这些信息传递给下一个视图控制器的正确方法是什么?

0 个答案:

没有答案