Swift在几个ViewControllers之间的争论中的可选错误

时间:2016-03-24 07:42:29

标签: ios swift

错误说明:

我们总是使用func prepareForSegue()在使用Segue期间传递数据。让我们假设情况:

一个名为TableViewController的TableViewController类包含一些单元格,这些单元格可以指向另一个名为DetailViewController的DetailViewController类,并触及特定单元格。

我的应用逻辑DetailViewController显示了一张图片,该图片在触摸Assets.xcassets中的单元格后保存在TableViewController文件夹中。在位于类funs prepareForSugue()的{​​{1}}中,我将Image传递给TableViewController的{​​{1}}属性的实例。 (目前,请忽略类DetailViewController)中名为imageName的属性

imageView的图像出现之前触摸了一个单元格后发生了错误。

DetailViewController


守则:

TableViewController:

DetailViewController

DetailViewController:

fatal error: unexpectedly found nil while unwrapping an Optional value


问题:

现在,我们可以使用类class TableViewController: UITableViewController { let delegate = UIApplication.sharedApplication().delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 0 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return 0 } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let identifier = segue.identifier { if identifier == "showDetailViewController" { let destinationController = segue.destinationViewController as! DetailViewController destinationController.imageView.image = UIImage(named: "DefaultFood") } } } } 中的class DetailViewController: UIViewController { var imageName = "" @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView.image = UIImage(name: imageName) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 属性。如果我只在位于imageName的{​​{1}}到DetailViewController中传递图像的名称,并检索位于func prepareForSegue()的{​​{1}}中的tableView.indexPathForSelectedRow }。 APP工作没有问题,在我触摸牢房后出现了我想要的图像。

顺便说一下,tableViewDataDelegate的data-Array是在AppDelegate.swift中创建并使用的。

修改TableViewController

UIImage.image

由于意外的func viewDidLoad()值,我真的不知道我的代码中的哪个变量会触发DetailViewController。即使我设置了可选的绑定语法,也会发生同样的错误。

当我只传递图像的名称时,为什么应用程序成功?

当UIImage属性在其自己的Class方法func prepareForSegue():中分配而不是override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let identifier = segue.identifier { if identifier == "showRestaurantDetail" { let destinationController = segue.destinationViewController as! DetailViewController if let indexPath = tableView.indexPathForSelectedRow { destinationController.imageName = self.delegate.restaurantData[indexPath.row].foodName } } } } 中的Optional Error时,此机制是否有效?


请教我如何理解这个问题。

非常感谢您的指导和时间。

Ethan Joe

0 个答案:

没有答案