如何在函数参数中传递ViewController名称?

时间:2020-05-13 12:20:24

标签: ios swift function alert

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,这给了我“未声明使用的错误”信息,因此我该如何在函数中发送视图控制器名称。 好吧,这是出于学习目的,对不起,如果我问错了事。 所以请指导我或帮助我 谢谢你。

2 个答案:

答案 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)
}