Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 斯威夫特';多个ViewController之间的Segue中的可选错误 错误说明:_Ios_Swift - Fatal编程技术网

Ios 斯威夫特';多个ViewController之间的Segue中的可选错误 错误说明:

Ios 斯威夫特';多个ViewController之间的Segue中的可选错误 错误说明:,ios,swift,Ios,Swift,在使用Segue时,我们总是使用func prepareforsgue()传递数据。让我们假设一下情况: 名为TableViewController的TableViewController类包含一些单元格,这些单元格可以通过触摸特定单元格而导致另一个名为DetailViewController的DetailViewController类 我的应用程序逻辑是DetailViewController在触摸TableViewController中的单元格后,显示一个图像,该图像保存在Assets.xc

在使用Segue时,我们总是使用
func prepareforsgue()
传递数据。让我们假设一下情况:

名为
TableViewController
的TableViewController类包含一些单元格,这些单元格可以通过触摸特定单元格而导致另一个名为
DetailViewController
的DetailViewController类

我的应用程序逻辑是
DetailViewController
在触摸
TableViewController
中的单元格后,显示一个图像,该图像保存在
Assets.xcsets
文件夹中。在类
TableViewController
中的
funs prepareForSugue()
中,我将图像传递给
DetailViewController
imageView
属性的实例。(现在,请忽略类
DetailViewController
中名为imageName的属性)

该错误发生在我触摸一个单元格之后,
DetailViewController
的图像显示之前

fatal error: unexpectedly found nil while unwrapping an Optional value

守则: TableViewController:

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.
  }
}
DetailViewController:

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.
  }
}

问题是: 现在,我们可以使用类
DetailViewController
中的
imageName
属性。如果我仅通过位于
TableViewController
中的
func-prepareforsgue()
表视图.indexPathForSelectedRow传递图像的名称,并在位于
DetailViewController
func-viewDidLoad()
中检索
UIImage.image
。该应用程序工作正常,在我触摸手机后显示了我想要的图像

顺便说一下,tableViewDataDelegate的数据数组是在AppDelegate.swift中创建和使用的

修改的
func prepareforsgue():

由于意外的
nil
值,我真的不知道代码中的哪个变量触发了
可选错误。即使我设置了可选绑定语法,也会出现相同的错误

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

此机制是否仅在其自己的类的方法中分配UIImage属性时有效,即类DetailViewController中的
viewDidLoad()
,而不是
TableViewController中的
func prepareForSegue()


请教我如何理解这个问题

非常感谢你的指导和时间


Ethan Joe

是您在
中的
顺序.destinationViewController
让destinationController=segue.destinationViewController为!DetailViewController
类型正确,而不是
nil
?如果让destinationController=segue.destinationViewController作为,您可以使用类似于
的方法来检查这一点?DetailViewController
(我不确定是否必须有一个问号将
标记为
)。我认为这是因为在尝试分配segue上的image属性时,UIImageView尚未分配。