如何创建一个通用函数来加载视图控制器?
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" 参数
这是我最初只使用 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")
现在,当我尝试在 //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
。但这是不必要的,因为无论如何您稍后都会将其分配给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
【讨论】:
谢谢@Sweeper,它工作得很好!我认为有必要在as!
之后更改“var3”,因为在我正在阅读的指南中,他们会根据我是在登录视图还是聊天视图中进行更改。 (如果我在登录视图中,则使用as! UINavigationController
,但如果我在聊天视图中,则使用as! LoginViewController
)我将阅读有关多态性的内容并继续学习。再次,非常感谢。以上是关于如何创建一个通用函数来加载视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章