我有一个表视图,每个单元格中都有一个图像。我想在用户选择单元格时将该图像传递给第二个视图控制器。我设置了从单元格到第二个视图控制器的segue。
然而,我的代码在第二个视图控制器中为图像生成nil。
我确定我应该为此使用代理,我发现大量的示例将它们传递回第一个视图控制器但不是这样的。我还没有弄清楚如何设置它。
有谁能举个例子?
TableView(第一视图控制器)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "imageCropSegue"{
if let destination = segue.destinationViewController as? cropImageView {
if let profileIndex = self.parseTable.indexPathForSelectedRow()?.row {
var index = NSIndexPath(forRow: profileIndex, inSection: 0)
var cell = self.parseTable.cellForRowAtIndexPath(index) as! TableViewCell
destination.cropImage.image = cell.cellImage.image //throws an exception as destination.cropImage = nil
}
}
}
}
第二个视图控制器
class cropImageView:UIViewController{
@IBOutlet weak var cropImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
答案 0 :(得分:0)
永远不要尝试从segue更新任何用户界面,始终从segue传递图像名称,或者您可以传递数组的索引,然后在下一个视图控制器中,您可以将该图像分配给ImageView
中的ViewDidLoad
1}}方法。
在您的代码中,您尝试使用以下代码从FirstViewController分配Image:
destination.cropImage.image = cell.cellImage.image
这不是分配图像的好方法。而不是你可以将ImageName从第一个视图传递到imageName数组的第二个视图,如下所示:
destination.imageName = yourImageNameArrya[index]
并进入第二个视图控制器,您必须添加一个包含此名称的实例,如下所示:
class cropImageView:UIViewController{
let imageName = "" //This will hold your image name
@IBOutlet weak var cropImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
cropImage.image = UIImage(named: imageName)
}
}
希望这会对你有所帮助。
答案 1 :(得分:0)
cropIsegue方法中未初始化cropImage。尝试将图像存储到cropImageView的字段中,并将其设置为viewDidLoad()生命周期中的cropImage.image。
答案 2 :(得分:0)
感谢@ mayank-jain的教程。
http://jamesleist.com/ios-swift-passing-data-between-viewcontrollers/
最后这很简单。我从未想过首先将它传递给变量。
答案 3 :(得分:0)
第二视图控制器:
class cropImageView:UIViewController{ @IBOutlet weak var cropImage: UIImageView! var selectedImage : UIImage? override func viewDidLoad() { super.viewDidLoad() self.cropImage.image = self.selectedImage //Assign selected Image here } }FirstView控制器中的
PrepareForSegue 方法如下:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "imageCropSegue"{ if let destination = segue.destinationViewController as? cropImageView { if let profileIndex = self.parseTable.indexPathForSelectedRow()?.row { var index = NSIndexPath(forRow: profileIndex, inSection: 0) var cell = self.parseTable.cellForRowAtIndexPath(index) as! TableViewCell //destination.cropImage.image = cell.cellImage.image //Change here destination.selectedImage= cell.cellImage.image } } } }