无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”

Posted

技术标签:

【中文标题】无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”【英文标题】:Cannot convert value of type "ViewController.Type" to expected argument type "UIViewController" 【发布时间】:2017-07-26 15:40:30 【问题描述】:

我正在尝试制作一个警报控制器,如果答案是“Ok”,那么它将对 MapView 执行 segue。完整代码如下:

@IBAction func teste(_ sender: Any) 

    // Create the alert controller
    let alertController = UIAlertController(title: "Reservar vaga?", message: "Uma vaga será reservada em Estapar Estacionamento.", preferredStyle: .alert)

    // Create the actions
    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: (alert:UIAlertAction) -> Void in

        let confirmAction = UIAlertController(title: "Vaga confirmada", message: "Gostaria de ter direções ao local?", preferredStyle: .alert)

        let okConfirmAction = UIAlertAction(title:"Sim", style: UIAlertActionStyle.default, handler:(alert:UIAlertAction) -> Void in

            presentViewController(ViewController, animated: true, completion: nil)
        )

        let noConfirmAction = UIAlertAction(title:"Não", style: UIAlertActionStyle.default) 
            UIAlertAction in
            NSLog("Ok Pressed")
        

        confirmAction.addAction(okConfirmAction)
        confirmAction.addAction(noConfirmAction)
        self.present(confirmAction, animated: true, completion: nil)
    )
    let cancelAction = UIAlertAction(title: "Cancelar", style: UIAlertActionStyle.cancel) 
        UIAlertAction in
        NSLog("Cancel Pressed")
    

    // Add the actions
    alertController.addAction(okAction)
    alertController.addAction(cancelAction)

    //Append the button to the view
    self.present(alertController, animated: true, completion: nil)

我在这部分遇到了麻烦:

let okConfirmAction = UIAlertAction(title:"Sim", style: UIAlertActionStyle.default, handler:(alert:UIAlertAction) -> Void in

    presentViewController(ViewController, animated: true, completion: nil)
)

当我尝试使用 presentViewController 时,出现此错误:“”

当我尝试使用 performSegue 时,我使用的是这种方式:

performSegue(withIdentifier: "teste", sender: (Any).self)

然后出现如下错误:“Implicit use of self inclosure; use 'self.'使捕获语义明确”

谁能帮帮我?

【问题讨论】:

我假设 ViewController 是类名,而不是类实例 - 因此问题 @Miknash 你能解释一下吗?我是 swift 新手:p 你有 ViewController 类吗?或者你有 var ViewController: MyViewController? 我有两个 viewController,第一个名为 ViewController(链接到我想在 segue 之后显示的地图视图)和第二个名为 ViewController2(链接到应用程序的初始视图)跨度> 【参考方案1】:

所以要修复okConfirmAction闭包中的presentViewController(ViewController, animated: true, completion: nil)函数,试试这个:

self?.present(ViewController(), animated: true, completion: nil)

对于 okConfirmAction 闭包中的 performSegue(withIdentifier:sender:) 函数,请尝试:

self?.performSegue(withIdentifier: "teste", sender: self)

因为它是一个闭包,所以你必须在调用函数之前使用 self 。这是为了让您意识到您可能会导致保留周期。

如下编写闭包以防止保留循环(使用弱self 引用意味着我们将self 替换为self? 作为present(_:animated:completion:)performSegue(withIdentifier:sender:) 的前缀):

let okConfirmAction = UIAlertAction(title:"Sim", style: UIAlertActionStyle.default, handler: [weak self] (alert:UIAlertAction) -> Void in
//insert code from above
)

【讨论】:

成功了!!非常感谢!我使用了你在 performSegue 中向我展示的功能,一切正常:) @LucasLeal 你接受了其他答案 - 如果这个是正确的,请接受这个【参考方案2】:

使用performSegue(withIdentifier: "teste", sender: self)。我不确定你想在self 之前使用(Any). 实现什么,因为类名上的self 返回类的type,而不是类的实例.

【讨论】:

我使用(任何)。在 self 之前,因为控制台告诉我这样做,老实说(对语言来说有点新)......当我只使用 self 时,它会回应我“在闭包中隐式使用'self';使用'self。'使捕获语义明确”。 啊。只有当你在一个块中时才会发生这种情况,你通常只需要在你的变量前面加上self?.

以上是关于无法将“ViewController.Type”类型的值转换为预期的参数类型“UIViewController”的主要内容,如果未能解决你的问题,请参考以下文章

无法将'ViewController.Type'类型的值转换为预期的参数类型'UIViewController'

“ViewController.Type 没有名为 'var 的成员

ViewController.Type 没有名为的成员

将场景中的 rootview 更改为视图控制器?

Objc <-> Swift 通用函数的 Swift 兼容性

无法将类型“类”的值分配给类型“[类]”