在segue中添加数据在运行时不会识别SecondViewController类

时间:2016-12-26 19:01:55

标签: ios iphone swift swift3 segue

所以这是我的第一个视图控制器类:

import UIKit

class AboutUsTableViewController: UITableViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let volunteerPageVC = segue.destination as! DedicatedVolunteerViewController
        // Idk why I have to use 'as!' instead of 'as'. Xcode made me do it
        volunteerPageVC.person = "John Smith"
    }

}

这是我的第二个视图控制器类:

import IUKit

class DedicatedVolunteerViewController: UIViewController {

    var person: String?

    @IBOutlet weak var HeaderTitle: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        HeaderTitle.text = "About " + person!;
    }
}

在我的主要故事板上,AboutUsTableView上的每个单元格都转到DedicatedVolunteerViewController。我希望能够有一个可以多次使用的视图控制器(即人物的配置文件)。

当我点击表格视图中的任何单元格时,我收到以下错误:

2016-12-26 11:44:27.075 MyApp iOS[8350:493673] Unknown class _TtC20MyApp_iOS31DedicateVolunteerViewController in Interface Builder file.
2016-12-26 11:44:29.698 MyApp iOS[8350:493673] Unknown class _TtC20MyApp_iOS31DedicateVolunteerViewController in Interface Builder file.

我很困惑,因为当我编译应用程序时,它没有给出关于"未知类"或者说我需要将DedicatedVolunteerViewController添加/导入AboutUsTableViewController以便能够使用它。我甚至尝试导入它,但Xcode不会让我继续给我错误。

P.S。考虑到大多数在线版本的swift或obj-c的旧版本的文档很难找到如何使用新版本的代码,我遇到了很多麻烦。

2 个答案:

答案 0 :(得分:0)

听起来你的故事板场景中的类名是错误的。按照表视图控制器中的segue跟随第二个视图控制器。然后选择目标视图控制器的场景,选择视图控制器本身,并选择“识别检查器”。检查目标视图控制器的类。从你得到的错误来看,它的类似_TtC20MyApp_iOS31DedicateVolunteerViewController而不是DedicateVolunteerViewController

答案 1 :(得分:0)

Swift使用'optionals',它实质上意味着一个可以为空的对象。期权可以有一个有效值或零。建议您使用'guard'语句来处理选项。

因此,您的prepareForSegue应如下所示:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let volunteerPageVC = segue.destination as? DedicatedVolunteerViewController else {
        //Handle the nil value, log, etc
        return
    }
    volunteerPageVC.person = "John Smith"
}

!显式展开可选 - 意味着它必须有一个值或应用程序将崩溃。您应该尽可能避免使用它们并使用?正如我在上面所示,而不是一个警卫声明。在上面的代码中,它尝试将segue.destination转换为DedicatedVolunteerViewController,但如果不能,则它将落入guard语句(意味着结果为nil)。

Apple网站上有很多关于选项的信息。查看:Swift Basics

至于你的具体错误,它看起来像一个简单的错误拼写。错误是指'DedicateVolunteerViewController'(缺少'd'),你的班级名称是'DedicatedVolunteerViewController'