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

时间:2017-04-16 13:48:19

标签: ios swift function uiviewcontroller swift3

我一直在尝试编写一个可以使用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件事:

  1. logVC 我打电话给 var1 ,用于// B,// D
  2. " LoginVC" 我打电话给 var2 ,用于// B
  3. LoginViewController 我打电话给 var3 ,用于// B
  4. 在我的新思维中,我想我可以创建一个包含" A,B,C,D" 行的函数,让我稍后在任何地方调用它更改" var1,var2,var3" 参数

    这是我首次使用 var1 var2 创建的:

    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")
    

    现在,当我尝试在第//行中使用 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")
    

    我想知道是否有可能做我正在成像的事情,因为我将函数看作可以用我需要的信息替换变量的等式。

    提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

你是在思考。你真的需要3个变量吗?

实际上,你只需要一个。

让我们看看为什么。

B中变量的名称是否真的重要? LoginViewController末尾的B是否真的需要在那里?不可以。变量名只是一个变量名。更改它不会改变您的代码。它可能会使您的代码更具可读性。 LoginViewController的结尾也是如此。这只会导致var1LoginViewController类型。但这是不必要的,因为无论如何你都要将它分配给rootViewControllerrootViewController的类型为UIViewController,因此您只需传递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
}