无法将viewController对象转换为Swift中的viewController类型

时间:2016-02-10 21:00:55

标签: ios swift uiviewcontroller

我想将数据从一个视图控制器传递到另一个视图控制器。我在<script type="text/javascript"> var year_test = '<?php echo date("Y",$timestamp); ?>'; year_test !=="1969" ? $('#login_div').html('<?php print ("Last login: " . date("l, F jS, Y g:h A",$timestamp)); ?>') : ''; </script> 中使用以下代码来执行此操作...

prepareForSegue

在第一行中,您可以看到在{之后有一个let detailVC: DetailVC = segue.destinationViewController as! DetailVC detailVC.alertDict = sender as! NSDictionary 。多数民众赞成因为我必须使用强制向下倾斜,如果我不包含!,那么我会收到错误:!无法转换为UIViewController 。但是DetailVCDetailVC类的继承,那为什么它不能转换呢?这是该类的代码..

UIViewController

2 个答案:

答案 0 :(得分:6)

这样想。

所有DetailVCs都是UIViewControllers,但并非所有 UIViewControllers都是DetailVCs

因此,您可以自由地将DetailVC转换为UIViewController,例如:

let detailVC = DetailVC()
let vc : UIViewController = detailVC as UIViewController

无法执行相反操作,因为视图控制器可能不是DetailVC

因此,您可以使用as!来强制强制强制转换为DetailVC

let vc : UIViewController = DetailVC()
let detailVC = vc as! DetailVC

如果是DetailVC,则转换没问题;如果不是,它就会崩溃。

如果你在演员之前不是100%肯定,你应该始终使用as?来检查转换前的类型。例如:

let vc : UIViewController = DetailVC()

if let detailVC = vc as? DetailVC {
    // do something
}

或者,正如user965972所说,如果转换失败,您可以使用guard语句更进一步防止任何进一步执行。例如:

let vc : UIViewController = DetailVC()

guard let detailVC = vc as? DetailVC else {
    // uh oh, casting failed. maybe do some error handling.
    return
}

// freely use detailVC from the this point onwards, with the correct type.

您使用的方法完全取决于您是否想要处理错误以及是否进一步执行取决于对转换是否成功。

答案 1 :(得分:0)

我假设您遇到了运行时错误。

确保在界面构建器中将视图控制器设置为正确的类。如果您首先在IB中设置类,然后在代码中定义类,则IB将找不到该类。您将通过查看&#34;模块&#34;来注意到这一点。 &#34; class&#34;下的字段IB中的字段。它不应该是&#34;无&#34;,而是类似项目的名称。