Есть ли способ получить доступ к розетке из одного класса в другой? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь получить UIImageView из ячейки представления коллекции в основной контроллер представления.Я очень старался, но не смог найти решение.Вот мой код: (я пытаюсь получить доступ к previewStep от uploadsubpostcell к оператору if внутри класса VC. Оператор if находится в функции выбора.)

EASY FIX, JUST DO: cell.(name).image!

class UploadSubPostCell: UICollectionViewCell {

    @IBOutlet weak var previewStep: UIImageView!

}

class UploadViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var previewImage: UIImageView!
    @IBOutlet weak var postBtn: UIButton!
    @IBOutlet weak var selectBtn: UIButton!

    @IBOutlet weak var selectStepsBtn: UIButton!


    var picker = UIImagePickerController()
    var isThumbnailImage = true
    var subpostsArray = [UIImage]()
    var subposts = [SubPost]()
    var posts = [Post]()

    override func viewDidLoad() {
        super.viewDidLoad()

        setupNavigationBarItems()
        picker.delegate = self

    }

    func setupNavigationBarItems() {
        navigationItem.title = "Upload"
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerEditedImage] as? UIImage {

            if isThumbnailImage {
                previewImage.image = image
            } else {
                previewStep.image = image
            }

            selectBtn.isHidden = false
            selectStepsBtn.isHidden = false
            postBtn.isHidden = false
            if isThumbnailImage == false {
                subpostsArray.append(image)
                subposts.count + 1
                print("Appended image to array:", subpostsArray)
            }
        }

        picker.dismiss(animated: true, completion: nil)
    }


    @IBAction func selectStepPressed(_ sender: Any) {

        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        isThumbnailImage = false

        self.present(picker, animated: true, completion: nil)

    }


    @IBAction func selectPressed(_ sender: Any) {

        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        isThumbnailImage = true

        self.present(picker, animated: true, completion: nil)

    }

    @IBAction func addNewPressed(_ sender: Any) {
    }


    @IBAction func postPressed(_ sender: Any) {
        AppDelegate.instance().showActivityIndicator()

        let uid = Auth.auth().currentUser!.uid
        let ref = Database.database().reference()
        let storage = Storage.storage().reference(forURL: "gs://mobile-d9fcd.appspot.com")

        let key = ref.child("posts").childByAutoId().key
        let imageRef = storage.child("posts").child(uid).child("\(key).jpg")
        let data = UIImageJPEGRepresentation(self.previewImage.image!, 0.6)

        let uploadTask = imageRef.putData(data!, metadata: nil) { (metadata, error) in
            if error != nil {
                print(error!.localizedDescription)
                AppDelegate.instance().dismissActivityIndicator()
                return
            }
                imageRef.downloadURL(completion: { (url, error) in
                    if let url = url {
                        let feed = ["userID" : uid,
                                    "pathToImage" : url.absoluteString,
                                    "likes" : 0,
                                    "author" : Auth.auth().currentUser!.displayName!,
                                    "postID" : key] as [String : Any]

                        let postFeed = ["\(key)" : feed]

                        ref.child("posts").updateChildValues(postFeed)
                        AppDelegate.instance().dismissActivityIndicator()
                        self.picker.dismiss(animated: true, completion: nil)
                        }
                    })
                }
            uploadTask.resume()
        }
        func numberOfSections(in collectionView: UICollectionView) -> Int {
            return 1

        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return self.subposts.count
        }

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath) as! PostCell

            cell.postImage.downloadImage(from: self.posts[indexPath.row].pathToImage)
            cell.authorLabel.text = self.posts[indexPath.row].author
            cell.likeLabel.text = "\(self.posts[indexPath.row].likes!) Likes"
            cell.postID = self.posts[indexPath.row].postID

        }
    }
}

1 Ответ

2 голосов
/ 03 июня 2019

@ Мэтт прав, в вашем случае вам следует обновить модель данных, которая представлена ​​collectionView, и вызвать reloadData или reloadItems (at:)

    self.updateModel();
    self.collectioView.reloadData()
    self.collectioView.reloadItems(at: [IndexPath(item: 0, section: 0)]);

Но если вам нужен прямой доступ к видимым ячейкам , вы можете использовать другой рабочий процесс:

    let image : UIImage? = nil
    let path = IndexPath(item: 0, section: 0)
    let visiblePaths = self.collectioView.indexPathsForVisibleItems
    if visiblePaths.contains(path) {
        if let cell = self.collectioView.cellForItem(at: path) as? UploadSubPostCell {
            cell.previewStep.image = image;
        }
    }

Вы можете использовать такой рабочий процесс для обновления только видимых ячеек, потому что невидимые ячейки будут повторно использованы перед отображением на экране

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...