放松瞄幕执行后新数据未更新

时间:2015-11-30 20:02:05

标签: ios swift uiimageview uicollectionview unwind-segue

我对Swift相对较新,并且我在这个问题上遇到了磕磕绊绊,这个问题很容易解决,我只是无法解决这个问题,并且不断碰到一堵砖墙。

我正在创建一个应用程序,用户在集合视图控制器中点击图像,然后执行展开segue回到主视图控制器并使用用户选择的图像更新uiimageview。我得到了放松工作但问题是uiimageview总是一个图像背后(即我选择图像A,展开segue后面没有图像显示,所以我选择图像B展开segue回来然后原始图像我选择了第一次,图像A,在uiimageview中)。

以下是目标视图控制器的代码(主视图控制器,我希望uiimageview根据在集合视图中选择的图像进行更新)...

 @IBAction func unwindToVC(segue:UIStoryboardSegue) {
    if(segue.sourceViewController .isKindOfClass(FrancoCollectionCollectionViewController))
    {
        let francoCollectionView:FrancoCollectionCollectionViewController = segue.sourceViewController as! FrancoCollectionCollectionViewController
        let selectedImageFromLibrary = selectedFranco
        dragImage!.image = UIImage(named: selectedImageFromLibrary)
    }

在用户选择图像并将其展开的集合视图控制器上,我只需按住+键将单元格拖动到"退出"在故事板上并选择了unwindToVC segue。

至于我的收藏视图是我如何设置的,因为我怀疑它与didSelectItemAtIndexPath部分相关,但我不确定...

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items
    return francoPhotos.count 
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! FrancoCellCollectionViewCell

    // sets each cell of collection view to be a uiimage view of francoPhotos

    let image = UIImage(named: francoPhotos[indexPath.row])
    cell.francoImageCell.image = image

    return cell
}

    // highlights cell when touched 
    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        selectedFranco = francoPhotos[indexPath.row]
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
        cell!.layer.borderWidth = 3.0
        cell!.layer.borderColor = UIColor.blueColor().CGColor

}
    override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)
        cell!.layer.borderWidth = 0.0
        cell!.layer.borderColor = UIColor.clearColor().CGColor
    }

很抱歉,如果我发布的代码太多了,但这是我的第一篇文章,就像我说我是开发新手一样,所以我认为最好包含一些额外的内容,而不是没有需要的内容。

非常感谢任何建议!

非常感谢! :)

2 个答案:

答案 0 :(得分:0)

这是因为在触发segue之后调用collectionView:didSelectItemAtIndexPath:。所以,它总是一个落后。

解决此问题的一种方法是使用performSegueWithIdentifier以编程方式调用展开segue ,而不是将其从单元格连接到出口。要执行此操作,请将您的出口segue从viewController顶部的 viewController 图标(最左侧的图标)连接到退出图标(最右侧的图标)。

wire programmatic exit segue

文档大纲视图中找到此segue,并在属性检查器中为其提供标识符,例如"myExitSegue"对。然后在didSelectItemAtIndexPath中,最后要做的就是致电performSegueWithIdentifier("myExitSegue", sender: self)

答案 1 :(得分:0)

这就是我要做的事情:

删除源VC展开操作中的代码以获取空的展开segue(显示新图像的逻辑将放入集合VC中):

@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}

为unwind segue提供一个字符串标识符,以便您可以不自动地以编程方式执行segue。在这里,我只是打电话给我"放松"。

enter image description here enter image description here

然后,在FrancoCollectionCollectionViewController内部放置一个属性来保存所选的UIImage:

var selectedFranco: UIImage!

didSelectItemAtIndexPath内将属性设置为所选图像,然后手动执行segue:

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    // ... 
    self.selectedFranco = francoPhotos[indexPath.row]
    self.performSegueWithIdentifier("Unwind", sender: self)
}

然后我会在prepareForSegue中添加FrancoCollectionCollectionViewController方法,将源视图控制器的图像设置为所选图像:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "Unwind" {
        let sourceVC = segue.destinationViewController as! YourSourceViewController
        sourceVC.dragImage.image = selectedImageView.image
    }
}