如何将图像从tableview传输到第二个视图

时间:2015-07-10 05:49:38

标签: ios swift

我有一个表视图,每个单元格中都有一个图像。我想在用户选择单元格时将该图像传递给第二个视图控制器。我设置了从单元格到第二个视图控制器的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()

    }
} 

4 个答案:

答案 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
            }
        }

    }
}