我们总是使用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