【问题标题】:accessing an array of images from 1 view controller to another, to add swipe gesture recognizer从一个视图控制器访问一组图像到另一个视图控制器,以添加滑动手势识别器
【发布时间】:2017-08-04 21:22:55
【问题描述】:

我有一个包含图像数组的集合视图。当我按下任何图像时,它将在另一个类中全屏打开该图像。我试图在第二个视图控制器中添加滑动手势识别器,但我不知道如何访问第一个视图控制器中的数组。

这是我第一个在集合视图中显示图像的视图控制器

class sowrController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource{


    @IBOutlet weak var collectionView: UICollectionView!

    var albums = [AlbumModel]()
    let db : DBHelperMo2lfat = DBHelperMo2lfat()
    var selectedIndex : Int = -1


    var posts : Post!

    override func viewDidLoad() {
        super.viewDidLoad()



        collectionView.delegate = self
        collectionView.dataSource = self
        self.albums.removeAll()
        self.albums.append(contentsOf: self.db.fetchAllImages())
        self.collectionView.reloadData()
        DataService.ds.REF_POSTS_SOWR.observe(.value, with: { (snapshot) in

            if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
                self.albums.removeAll()
                for snap in snapshot {
                    print ("SNAP: \(snap)")

                    if let postDict = snap.value as? Dictionary<String, AnyObject>{
                        let album : AlbumModel = AlbumModel(id: postDict["id"] as! String, name: postDict["image_name"] as! String, path: postDict["image_path"] as! String, url: postDict["image_path"] as! String, localPath: "")

                        if let items = snap.children.allObjects as? [FIRDataSnapshot] {
                            for itemSnap in items {
                                if let albumSnap = itemSnap.value as? Dictionary<String, AnyObject> {
                                    album.childAlbums.append(AlbumModel(id: albumSnap["id"] as! String, name: albumSnap["image_name"] as! String, path: albumSnap["image_path"] as! String, url: albumSnap["image_path"] as! String, localPath: ""))
                                }
                            }
                        }
                        self.albums.append(album)

                    }
                }
                self.collectionView.reloadData()
            }

        })

    }


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


        return self.albums.count

    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Constants.BookCellReuseIdentifier, for: indexPath) as? collectionViewCellSowr {

            let album = albums[indexPath.item]
            cell.initWithAlbumModel(album: album)

            return cell
        }else {
            return collectionViewCellSowr()
        }

    }

    private struct Constants {
        static let BookCellReuseIdentifier = "cell"
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        self.selectedIndex = indexPath.row
        self.performSegue(withIdentifier: "showAlbum", sender: self)
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "showAlbum"
        {

            let vc = segue.destination as! imageFullScreen

            vc.images = self.albums[self.selectedIndex]

        }
    }

这是第二个让图像全屏显示的视图控制器

class imageFullScreen: UIViewController{


    var images : AlbumModel?
    let db : DBHelperMo2lfat = DBHelperMo2lfat()

    @IBAction func pictureSwipe(_ sender: Any) {

    }

    @IBOutlet weak var caption: UILabel!
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.caption.text = images?.imageName
        let url =  URL(string: (images?.imagePath)!)
        self.imageView.sd_setImage(with: url, placeholderImage: nil, options: [.progressiveDownload,.retryFailed])
    }

【问题讨论】:

    标签: swift


    【解决方案1】:

    编辑:

    好的,这是一个集合视图控制器,它将图像视图创建为子视图并响应滑动手势。请确保您的资产文件夹中有两个图像“Image”和“Image-1”。

    //
    //  CollectionViewController.swift
    //  test
    //
    //  Created by Yonatan Vainer on 05/08/2017.
    //  Copyright © 2017 Sensus Healthcare LLC. All rights reserved.
    //
    
    import UIKit
    
    private let reuseIdentifier = "id"
    
    class CollectionViewController: UICollectionViewController {
    
        var imageView = UIImageView(frame: CGRect(x: 0, y: 100, width: 300, height: 300))
        var index = 0;
        let names = ["Image","Image-1"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //For left swipe
            let left = UISwipeGestureRecognizer(target: self, action: #selector(self.goLeft(_:)))
            left.direction = .left
            imageView.addGestureRecognizer(left)
    
            //For right swipe
            let right = UISwipeGestureRecognizer(target: self, action: #selector(self.goRight(_:)))
            right.direction = .right
            imageView.addGestureRecognizer(right)
    
            imageView.isUserInteractionEnabled = true
    
            self.view.addSubview(imageView)
            self.view.layoutSubviews()
    
            // Uncomment the following line to preserve selection between presentations
            // self.clearsSelectionOnViewWillAppear = false
    
            // Register cell classes
    
    
            // Do any additional setup after loading the view.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        /*
        // MARK: - Navigation
    
        // In a storyboard-based application, you will often want to do a little preparation before navigation
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            // Get the new view controller using [segue destinationViewController].
            // Pass the selected object to the new view controller.
        }
        */
    
        // MARK: UICollectionViewDataSource
    
        override func numberOfSections(in 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 names.count
        }
    
        override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
    
            // Configure the cell
            let nail = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
            nail.image = UIImage(named: names[indexPath.row])
    
            cell.backgroundView = nail
            return cell
        }
    
        override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            imageView.image = UIImage(named: names[indexPath.row])
            index = indexPath.row
        }
    
        func goLeft(_ gesture: UISwipeGestureRecognizer){
            index += 1
            if index<0{
                index = 0
            }
            imageView.image = UIImage(named: names[index])
        }
    
        func goRight(_ gesture: UISwipeGestureRecognizer){
            index -= 1
            if index>1{
                index = 1
            }
            imageView.image = UIImage(named: names[index])
        }
    
        // MARK: UICollectionViewDelegate
    
        /*
        // Uncomment this method to specify if the specified item should be highlighted during tracking
        override func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
            return true
        }
        */
    
        /*
        // Uncomment this method to specify if the specified item should be selected
        override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
            return true
        }
        */
    
        /*
        // Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item
        override func collectionView(_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool {
            return false
        }
    
        override func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
            return false
        }
    
        override func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) {
    
        }
        */
    
    }
    

    ================================================ ====================

    在情节提要中,单击您的集合视图并嵌入导航控制器。 这将添加一个带有后退按钮的顶部栏。 附image。

    【讨论】:

    • 我要做的是在一组图像之间左右滚动,类似于任何图像库
    • 好的。选项很少。这是一个:在这种情况下,不要使用第二个视图控制器。在集合视图控制器内的任何单元格上单击,以编程方式创建 UIImageView,用您的图像填充它,通过分配宽度和高度使其全屏显示,并将其添加为子视图。然后,当您获得滑动手势时,只需分配不同的图像并重新加载视图。
    • 刚刚更新了我的答案。在我的模拟器上检查它,它工作正常。如果是你需要的,欢迎采纳:)
    【解决方案2】:

    我不确定我是否完全理解你的问题,因为我不明白数组与手势识别器有什么关系,但如果你只是想从以前的 ViewController 访问数组,这应该可以工作 如果你有导航控制器:

    let vcIndex = self.navigationController?.viewControllers.index(where: { (viewController) -> Bool in
    
                if let _ = viewController as? sowrController {
                    return true
                }
                return false
    })
    
    let prevVC = self.navigationController?.viewControllers[vcIndex!] as! sowrController
    let albums:[AlbumModel] = prevVC.albums
    

    【讨论】:

    • @abdo 查看this link。 Duncan C 的答案正是您所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多