Swift 4,加载下一个 ViewController

Posted

技术标签:

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

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

重点是

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

目前我唯一的想法是:

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

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

编辑:

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

【问题讨论】:

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

【讨论】:

以上是关于Swift 4,加载下一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

TableView 没有加载任何 JSON 数据 Swift 4

iOS Swift:在呈现 imagePicker 后,SlidingMenuView 位置错误

Swift 3 - 在启动时加载多个 ViewController

Swift:为 CustomTab 重用一个 ViewController

使用 Firebase Firestore 进行分页 - swift 4

Swift添加可点击的tableview