func showalertOkayButton(message: String?, identifier: string?, viewControllerName: UIViewController){
let alertController = UIAlertController(title: kMessage, message: message, preferredStyle: .alert)
let defaultaction = UIAlertAction(title: kOkay, style: UIAlertAction.Style.default, handler:{ defaultaction in
let VC = UIStoryboard(name: kMainStoryBoard, bundle: nil).instantiateViewController(withIdentifier: identifier) as! viewControllerName
self.navigationController?.pushViewController(VC, animated: true)
})
alertController.addAction(defaultaction)
present(alertController, animated: true, completion: nil)
}
所以我的问题是我无法发送viewControllerName
,这给了我“未声明使用的错误”信息,因此我该如何在函数中发送视图控制器名称。
好吧,这是出于学习目的,对不起,如果我问错了事。
所以请指导我或帮助我
谢谢你。
答案 0 :(得分:2)
您误解了as
的工作方式。在x as! y
中,y不是名称,而是类型。并且当您将viewControllerName: UIViewController
作为函数参数时,即没有传递 name ,而传递了UIViewController type 的 instance 。因此,如果您想指定as
的对象,则需要传递 type 作为函数参数。使用泛型,如下所示:
func showalertOkayButton<T: UIViewController>(message: String?, identifier: String, viewControllerType: T.Type) {
let alertController = UIAlertController(title: kMessage, message: message, preferredStyle: .alert)
let defaultaction = UIAlertAction(title: kOkay, style: UIAlertAction.Style.default, handler:{ defaultaction in
let VC = UIStoryboard(name: kMainStoryBoard, bundle: nil).instantiateViewController(withIdentifier: identifier) as! T
self.navigationController?.pushViewController(VC, animated: true)
})
alertController.addAction(defaultaction)
present(alertController, animated: true, completion: nil)
}
调用它看起来像这样
showalertOkayButton("Message", "VCIdentifier", MyViewController.self)
但是,在您的特定情况下,这些都不是必需的。 Swift是一种动态语言,因此从情节提要中实例化视图控制器时,它可以在运行时加载其动态类型信息。但是编译器不知道它是什么类型,因此它为您提供了一个简单的UIViewController
实例。直到您需要在该视图控制器上调用as
超类中不存在的特定方法之前,不必使用UIViewController
对其进行强制转换。
即使您不进行强制转换,由于多态性,它将继续正确运行。因此,您可以将代码缩短为此
func showalertOkayButton(message: String?, identifier: String) {
let alertController = UIAlertController(title: kMessage, message: message, preferredStyle: .alert)
let defaultaction = UIAlertAction(title: kOkay, style: UIAlertAction.Style.default, handler:{ defaultaction in
let VC = UIStoryboard(name: kMainStoryBoard, bundle: nil).instantiateViewController(withIdentifier: identifier)
self.navigationController?.pushViewController(VC, animated: true)
})
alertController.addAction(defaultaction)
present(alertController, animated: true, completion: nil)
}
答案 1 :(得分:1)
Swift是静态的,不是动态的。所有类型都必须事先知道。您不能传递未知类型并在运行时说“ cast to this type”。但是您不需要!只需删除有关视图控制器“名称”(实际上是其类)的内容即可。您可以在不知道其特定类的情况下推送视图控制器。这是一个视图控制器!编译器知道这一点,这就是它所需要知道的全部。只需删除有关视图控制器类型的内容,一切都会很好。
func showalertOkayButton(message: String?, identifier: String)
let alertController = UIAlertController(title: kMessage, message: message, preferredStyle: .alert)
let defaultaction = UIAlertAction(title: kOkay, style: UIAlertAction.Style.default, handler:{ defaultaction in
let VC = UIStoryboard(name: kMainStoryBoard, bundle: nil).instantiateViewController(withIdentifier: identifier)
self.navigationController?.pushViewController(VC, animated: true)
})
alertController.addAction(defaultaction)
present(alertController, animated: true, completion: nil)
}