【问题标题】:Swift 4, load next ViewControllerSwift 4,加载下一个 ViewController
【发布时间】:2018-04-10 07:43:58
【问题描述】:

在我的应用程序中,我在导航控制器中嵌入了两个视图控制器。我想有一个选项来从 SecondVC 获取数据,而只打开 FirstVC。所以这就像我不希望用户看到(或至少与 SecondVC 交互)。

重点是

所以用户只需点击 FirstVC 上的按钮(之前没有打开 SecondVC),我就可以访问 SecondVC 上的数据。 如何在不打开导航控制器的情况下从下一个视图控制器(SecondVC)获取数据?或者至少不让用户与之交互。

目前我唯一的想法是:

  1. 要在用户点击按钮时推动 segue,将其放入内存,加载数据然后关闭它。但是当视图控制器变化如此之快时,这看起来并不好。

  2. 要以模态方式在屏幕外显示下一个视图控制器,请获取数据并关闭它。所以用户甚至不会看到另一个视图控制器打开了。

编辑:

我需要访问的不仅仅是方法或某种东西。我需要去@IBOutlet。到 UIView 的子类(与 CorePlot 一起工作)是准确的

【问题讨论】:

  • 将通用数据和逻辑放在一个单例对象中 (cocoacasts.com/…)。所以你可以从两个 VC 访问它
  • 选择相同的路径,如果我理解正确,您无意显示 secondVC 只是想从中获取一些数据。如果你实例化视图控制器并获取数据怎么办,不要推送它。
  • 你的意思是,你想在打开第二个VC之前从api获取数据吗?或者你只是想访问第二个 VC 的方法并在去那个 VC 之前调用它们?
  • @MRizwan33 只想访问第二个 VC 的方法并在去那个 VC 之前调用它们。我想说,即使不去(不向用户展示)第二个 vc

标签: ios swift swift4


【解决方案1】:

您不应该直接致电loadView()

实例化你的 UIViewController 然后调用loadViewIfNeeded()

调用此方法会从其故事板文件中加载视图控制器的视图,或根据既定规则根据需要创建视图。

编辑:

let storyboard = UIStoryboard(name: "Main", bundle: nil)

// make sure that the value is an optional so that you can unset it later. This one is optional because we use optional casting (with as?)
var vc = storyboard.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController
vc?.loadViewIfNeeded()

// use the vc

// later unset vc variable
vc = nil

【讨论】:

  • 好的,我明白了,一切正常,这就是我想要的。虽然我还有一个问题。以这种方式调用后如何从内存中删除视图控制器?
  • 只需取消设置您对 vc 的引用。我将用示例更新答案。
【解决方案2】:

为此,您必须使用“modalPresent”调用您的 2ed 视图控制器,并且 2edVC 的背景必须清除。然后从 2ed VC 获取数据。没有变化。有关 modalPresent 的更多信息,请访问 link

【讨论】:

    【解决方案3】:

    解决方案:

    你可以为它创建一个函数,或者只是插入到 viewDidLoad() 等中。

    不要忘记更改所选视图控制器的 StoryboardID(可以在身份检查器的故事板文件中完成)。

        // You need to get to your Storyboard and instantiate the needed View Controller
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        var graphVC = storyboard.instantiateViewController(withIdentifier: "graphVCID") as? graphVC
    
        // Then call loadViewIfNeeded (don't call loadView()) to load @IBOutlet's etc
        graphVC?.loadViewIfNeeded()
    
        // My outlets are loaded with data when these functions are called
        graphVC?.viewDidLoad()
        graphVC?.viewWillAppear(false)
    
        // Unset the reference to VC
        graphVC = nil
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      相关资源
      最近更新 更多