无法将“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 的成员