Пользовательская ячейка Tableview исчезает при перезагрузке таблицы с новым изображением - PullRequest
0 голосов
/ 05 ноября 2018

У меня очень странная проблема, с которой я не сталкивался во время разработки. Это очень затрудняет поиск и устранение неисправностей из-за того, что приложение не аварийно завершает работу, и в окне консоли отсутствуют ошибочные выходные данные отладки.

У меня есть редактирование профиля пользователя ViewController. На этой странице отображаются имя и фамилия пользователя, адрес электронной почты и номер телефона, а также изображение. Это все извлекается из Firebase и работает нормально. «Картинка», которую вы видите, представляет собой фактический JPG, который «загружается», когда кто-то создает учетную запись, таким образом, URL-адрес фотографии хранится в его базе данных, и я могу получить ее для отображения фотографии. Теоретически, когда «редактируешь» профиль, пользователь видит там реальную картинку и «меняет» ее на ту, которую он берет или загружает.

Проблема, с которой я столкнулся, заключается в том, что, когда я заканчиваю выбирать изображение из галереи или беру его с камеры, он корректно отклоняет камеру или галерею, но «ячейка табличного обзора» исчезает, и я не вижу ни изображения, ни текст. Как ни странно, текстовые поля остаются, которые не являются частью таблицы. Намерение состоит в том, чтобы картинка, которая была «снята», временно появлялась в представлении UIImage (которое находится в ячейке таблицы), а затем, когда пользователь нажимает «сохранить», она загружается в FireBase (ту часть, которую я знаю, как это сделать). Затем этот VC удаляется, а данные в ProfileVC перезагружаются из FireBase с новым изображением.

У меня есть часть FireBase, так как я правильно (я думаю) закодировал средство выбора изображений, но должно быть что-то, чего мне не хватает в связи с тем, почему временное изображение не отображается.

В качестве дополнительного шага по устранению неполадок я закомментировал строку: self.editProfileTable.reloadData () в функции imagePickerContoller в файле EditProfileVC.swift . Когда я сделал это, после нажатия «выбрал Фото», этот вид закрывается, и он возвращается к изображению Перед обновлением ниже. Это должно быть что-то со столом, но я просто не вижу этого.

Я включил весь соответствующий код ниже.

EditProfileVC.swift

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage

class EditProfileVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, Alertable, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    var delegate : ImagePickerDelegate?
    var tempImage : UIImage?
    var imagePicker : UIImagePickerController?

    @IBOutlet var editProfileTable: UITableView!
    @IBOutlet var editEmailTextField: UITextField!
    @IBOutlet var editMobileTextField: UITextField!

    var editProfileInfo = [EditProfileModel]()

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return editProfileInfo.count
    }


    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

        let cell = tableView.dequeueReusableCell(withIdentifier: "editprofilecell", for: indexPath) as! EditProfileTableViewCell

        let editprofile: EditProfileModel

        editprofile = editProfileInfo[indexPath.row]

        cell.firstNameLabel.text = editprofile.firstname
        cell.lastNameLabel.text = editprofile.lastname
        cell.emailLabel.text = editprofile.email
        cell.mobileLabel.text = editprofile.mobile


        cell.tapButton = {(user) in
            self.pickImage()
        }


        if tempImage == nil {
        DataService.instance.REF_USERS.observeSingleEvent(of: .value, with: { (snapshot) in
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                self.editProfileInfo.removeAll()
                for snap in snapshot {
                    if snap.key == Auth.auth().currentUser?.uid {
                        let imageUrl = snap.childSnapshot(forPath: "userPhoto").value
                        //  print(imageUrl)
                        let storage = Storage.storage()
                        let ref = storage.reference(forURL: imageUrl as! String)
                        ref.getData(maxSize: 1 * 1024 * 1024) { data, error in
                            if error != nil {
                                // Uh-oh, an error occurred!
                            } else {

                                cell.updateProfileImage.image = UIImage(data: data!)
                            }
                        }
                    }
                }
            }
        })
    }

        delegate?.pickImage()

        cell.updateProfileImage.image = tempImage

        return cell

    }


    override func viewDidLoad() {
        super.viewDidLoad()

        editEmailTextField.delegate = self
        editMobileTextField.delegate = self

        view.bindtoKeyboard()

       imagePicker = UIImagePickerController()


        let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
        self.view.addGestureRecognizer(tap)

        DataService.instance.REF_USERS.observeSingleEvent(of: .value, with: { (snapshot) in
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                self.editProfileInfo.removeAll()
                for snap in snapshot {
                    if snap.key == Auth.auth().currentUser?.uid {
                        let profileObject = snap.value as? [String: AnyObject]
                        let profileFirstName = profileObject?["first_name"]
                        let profileLastName = profileObject?["last_name"]
                        let profileMobile = profileObject?["mobile_number"]
                        let profileEmail = Auth.auth().currentUser?.email

                        let editprofile = EditProfileModel(firstname: profileFirstName as! String?, lastname: profileLastName as! String?, email: profileEmail , mobile: profileMobile as! String?)

                        self.editProfileInfo.append(editprofile)
                    }

                    self.editProfileTable.reloadData()
                }
            }
        })

             delegate?.pickImage()
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    @objc func handleScreenTap(sender: UITapGestureRecognizer) {
        self.view.endEditing(true)
    }

    func pickImage() {
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
            self.openCamera()
        }))

        alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in
            self.openGallery()
        }))

        alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))

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

//        let imagePicker = UIImagePickerController()
//        imagePicker.delegate = self
//        imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
//        imagePicker.allowsEditing = false
//        self.present(imagePicker, animated: true, completion: nil)
    }

    func openCamera()
    {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerController.SourceType.camera
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let alert  = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    func openGallery()
    {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.allowsEditing = true
            imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let alert  = UIAlertController(title: "Warning", message: "You don't have perission to access gallery.", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
        if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            tempImage = pickedImage
            self.editProfileTable.reloadData()
            dismiss(animated: true, completion: nil)
        // imageViewPic.image = pickedImage
        }
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated:  true, completion: nil)
    }

EditProfileModel.swift

class EditProfileModel {

    var firstname: String?
    var lastname: String?
    var email: String?
    var mobile: String?

    init(firstname: String?, lastname: String?, email: String?, mobile: String?){
        self.firstname = firstname
        self.lastname = lastname
        self.email = email
        self.mobile = mobile
    }
}

EditProfileTableViewCell.swift

import UIKit
import Foundation

var delegate : ImagePickerDelegate?

class EditProfileTableViewCell: UITableViewCell {

    @IBOutlet var updateProfileImage: UIImageView!
    @IBOutlet var firstNameLabel: UILabel!
    @IBOutlet var lastNameLabel: UILabel!
    @IBOutlet var emailLabel: UILabel!
    @IBOutlet var mobileLabel: UILabel!


    override func awakeFromNib() {
        super.awakeFromNib()

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func btdDetailsClick(_ sender: Any) {
        tapButton?(self)
        delegate?.pickImage()
    }
    var tapButton: ((UITableViewCell) -> Void)?


}

ImagePicker.swift

import UIKit
import Foundation

protocol ImagePickerDelegate {

    func pickImage()

}

Перед обновлением Нажата кнопка Изображение

После нажатия кнопки «Обновить изображение» и запуска всего кода выше

...