ios - 如何创建一个通用函数来加载 View Controller ?

标签 ios swift function uiviewcontroller swift3

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

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

@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

在我的新思维中,我想象我可以创建一个包含 "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")

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

提前谢谢大家。

最佳答案

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

实际上,您只需要一个。

让我们看看为什么。

B 中变量名真的很重要吗? B 末尾的 LoginViewController 真的需要存在吗?不,变量名只是一个变量名。更改它不会改变您的代码。不过,它可能会使您的代码更具可读性。 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
}

关于ios - 如何创建一个通用函数来加载 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43437924/

相关文章:

xcode - 编译一个开源 iPhone 应用程序

c++ - 声明一个没有内容的函数; - 然后是内容 {} - C++

function - 实现递归函数(阶乘)时出现堆栈溢出错误

ios - Swift 3 私有(private)访问?

ios - 通过仅覆盖某些数据 Swift 3 在 Firebase 数据库中设置值

ios - 在 viewWillAppear 中设置约束

swift - Grand Central Dispatch with Swift : Use of unresolved identifier GCD

ios - 处理 launchOptions 时的 RxSwift FirebaseDatabase 快照 <null>?[UIApplicationLaunchOptionsKey.remoteNotification]

r 中参数数量可变的回归函数

ios - 位置权限提醒按钮回调