如何创建一个通用函数来加载视图控制器?

Posted

技术标签:

【中文标题】如何创建一个通用函数来加载视图控制器?【英文标题】:How to create a generic function to load a view controller? 【发布时间】:2017-04-16 13:48:18 【问题描述】:

我一直在尝试编写一个使用 3 个参数的函数来加载视图控制器,但我无法让它工作。

我是编码新手,我正在阅读使用 2 个视图控制器(登录和聊天)的教程。为了从一个到另一个,指南告诉我无论我想登录还是注销都使用它:

@IBAction func loginDidTapped(_ sender: Any) 

    // A
    let storyboard = UIStoryboard (name: "Main", bundle: nil)   
    // B
    let logVC = storyboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginViewController   
    // C
    let appDelegate = UIApplication.shared.delegate as! AppDelegate   
    // D
    appDelegate.window?.rootViewController = logVC        

如果我想登录或注销,我必须更改 3 件事:

    logVC我称之为 var1,用于 // B , // D "LoginVC"我称之为 var2,用于 // B LoginViewController我称之为 var3,用于 // B

在我的新手头脑中,我想我可以创建一个包含 "A、B、C、D" 行的函数,然后让我稍后只需更改 就可以在任何地方调用它" var1, var2, var3" 参数


这是我最初只使用 var1var2 创建的:

import Foundation
import UIKit
import FirebaseAuth

    class Helper 
        static let helper = Helper()

        func loadView (var1 : String , var2 : String) 

            let storyboard = UIStoryboard (name: "Main", bundle: nil)
            let var1 = storyboard.instantiateViewController(withIdentifier: var2) as! LoginViewController
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            appDelegate.window?.rootViewController = var1
         
    

我这样称呼它并且它起作用了:

Helper.helper.loadView(var1: "logVC" , var2: "LoginVC")

现在,当我尝试在 //B 行中使用 var3 时,在同一个函数中,Xcode 会在 var3 下划线并显示此错误:

使用未声明的类型 'var3'

这是添加 var3 参数后的样子:

    func loadView (var1 : String , var2 : String , var3 : String) 

                    let storyboard = UIStoryboard (name: "Main", bundle: nil)
                    let var1 = storyboard.instantiateViewController(withIdentifier: var2) as! var3
                    let appDelegate = UIApplication.shared.delegate as! AppDelegate
                    appDelegate.window?.rootViewController = var1

如果它起作用了,我会这样称呼它:

Helper.helper.loadView(var1: "logVC" , var2: "LoginVC" , var3: "LoginViewController")

我想知道是否有可能做我正在想象的事情,因为我将函数视为方程式,我可以用我需要的信息替换变量。

提前谢谢大家。

【问题讨论】:

既然你自称是新手,我得告诉你。你这么多新手,你甚至不知道如何拼写 NOOB 哈哈 【参考方案1】:

你想多了。你真的需要 3 个变量吗?

其实,你只需要一个。

让我们看看为什么。

变量的名称在B 中真的很重要吗? LoginViewController 末尾的 B 真的需要在那里吗?不,变量名只是一个变量名。更改它不会改变您的代码。不过,它可能会使您的代码更具可读性。 LoginViewController 作为结尾也是如此。这只会导致var1 的类型为LoginViewController。但这是不必要的,因为无论如何您稍后都会将其分配给rootViewControllerrootViewControllerUIViewController 类型,所以你可以传递 UIViewController 类型的任何变量。要了解有关此行为的更多信息,请查看 多态性

因此,您的方法就是这样:

func presentVC(name: String) 

    let storyboard = UIStoryboard (name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: name)
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window?.rootViewController = vc

【讨论】:

谢谢@Sweeper,它工作得很好!我认为有必要在as! 之后更改“var3”,因为在我正在阅读的指南中,他们会根据我是在登录视图还是聊天视图中进行更改。 (如果我在登录视图中,则使用as! UINavigationController,但如果我在聊天视图中,则使用as! LoginViewController)我将阅读有关多态性的内容并继续学习。再次,非常感谢。

以上是关于如何创建一个通用函数来加载视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器中动态加载 iPhone/iPad 的 nib

ASP.NET MVC 通用局部视图模式

使用标签栏从另一个视图返回时如何重新加载视图控制器

如何显示随机视图?

在 Xcode 中使用 CoreData 从模态视图控制器重新加载视图

如何在加载视图控制器之前使用来自服务器/数据库的数据来显示视图控制器