2016-04-08 14 views
0

我想创建一个简单的联系人列表应用程序作为学习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'/致命错误:意外地发现零,而解包和可选值。

为什么我不能设置controller.fiName?.text?预先感谢您的任何帮助。

+0

你读过我的回答了吗? –

回答

2

我猜你的filNameUILabelUITextField吧?

如果您在DetailViewController检查你的代码,你会发现这条线:

@IBOutlet weak var filName: UITextField! 

你看!在该行的结束?

这意味着变量(aka outlet)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 
     } 
} 

然后在viewDidLoadDetailViewController的:

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 
} 
+0

哇!非常感谢您的回复。当我执行代码时,如果你已经布局,我仍然意外地发现零,同时解开可选值。另外,由于没有'object.firstName'(但由于某种原因有一个object.middleName ??),所以它看起来好像没有被正确传递。 –

+0

我弄明白了,一个简单的小错误,我我永远感谢您的帮助先生! –

2

您正在设置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) 
    } 
} 

然后在接下来的viewController viewDidLoad中设置文本:

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

嗨,乔!非常感谢您的回复。所有的答案都让我更好地理解我正在尝试做什么。对不起,我没有更早回复你的答案,我写了一半的回复,并忘记了它:-)一切顺利 –

+0

没问题@LiamS,如果你可以投票/将它标记为接受我的会很好。希望我能帮上忙。 –

1

只是对象应在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) 
    } 
}