Swift不允许我设置变量数据



我正在尝试创建一个简单的联系人列表应用程序,作为学习Swift的途径。不幸的是,无论我尝试什么,我都无法将联系人的详细信息显示在与表视图(包含主要联系人)不同的视图控制器上的可编辑文本字段中。

这是应该影响文本字段的代码块(我不确定要提供什么其他代码)

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row]
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
            print(object.firstName)
            controller.fiName?.text = object.firstName
            controller.laName?.text = object.lastName
            controller.miName?.text = object.middleName
            controller.aess?.text = object.address
            controller.phoNumber?.text = object.phoneNumber
            controller.yearBirth?.text = String(object.age)
            print(controller.fiName)
            controller.detailItem = object
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }

第一行打印的结果与我预期的一样,这是联系人的名称,但程序在第二行打印时崩溃,出现"EXC_BAD_INSTRUCTION"/致命错误:在展开时意外发现nil和可选值。

为什么我不能设置控制器.fiName?。文本提前感谢您的帮助。

我猜您的filNameUILabel还是UITextField

如果你在DetailViewController中检查你的代码,你会注意到这一行:

@IBOutlet weak var filName: UITextField!

你看到线路尽头的!了吗?

这意味着,变量(又名出口)filName不能在初始化时设置,但将在稍后的某个时刻设置。

现在,您要做的是初始化您的类,并尝试访问在初始化时尚未设置的属性。

要解决此问题,请在DetailViewController中创建一个对象实例,并将该实例设置为所选对象,然后在viewDidLoad函数中设置标签属性。

类似这样的东西:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row]
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
            controller.object = object
        }
}

然后在DetailViewControllerviewDidLoad中:

override viewDidLoad() {
       fiName?.text = object.firstName
       laName?.text = object.lastName
       miName?.text = object.middleName
       aess?.text = object.address
       phoNumber?.text = object.phoneNumber
       yearBirth?.text = String(object.age)
       navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
       navigationItem.leftItemsSupplementBackButton = true
}

您设置fiName标签文本太早,标签尚未分配。相反,通过对象,然后在下一个控制器的viewDidLoad中设置文本。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
        let object = objects[indexPath.row]
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
        //pass through object:
        controller.object = object
        print(object)
    }
}

然后在下一个视图Controller视图DidLoad中设置文本:

override viewDidLoad() {
    //Now set the text value here:
    fiName?.text = object.firstName
}

只应在prepareForSegue 中传递对象

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDetail" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = objects[indexPath.row]
                let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = object
                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
                controller.navigationItem.leftItemsSupplementBackButton = true
            }
        }
    }

然后应在viewDidLoad 中设置出口

class DetailViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        fiName?.text = detailItem.firstName
        laName?.text = detailItem.lastName
        miName?.text = detailItem.middleName
        aess?.text = detailItem.address
        phoNumber?.text = detailItem.phoneNumber
        yearBirth?.text = String(detailItem.age)
    }
}

最新更新