我一直在尝试编写一个可以使用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件事:
在我的新思维中,我想我可以创建一个包含" 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")
我想知道是否有可能做我正在成像的事情,因为我将函数看作可以用我需要的信息替换变量的等式。
提前谢谢大家。
答案 0 :(得分:1)
你是在思考。你真的需要3个变量吗?
实际上,你只需要一个。
让我们看看为什么。
B
中变量的名称是否真的重要? LoginViewController
末尾的B
是否真的需要在那里?不可以。变量名只是一个变量名。更改它不会改变您的代码。它可能会使您的代码更具可读性。 LoginViewController
的结尾也是如此。这只会导致var1
为LoginViewController
类型。但这是不必要的,因为无论如何你都要将它分配给rootViewController
。 rootViewController
的类型为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
}