重新加载带有新图片的表格时,自定义Tableview单元格消失

时间:2018-11-05 00:17:46

标签: swift firebase imageview tableview uiimagepickercontroller

我遇到了一个非常奇怪的问题,在开发过程中从未见过。由于应用程序没有崩溃且控制台窗口中没有错误的调试输出,因此很难进行故障排除。

我有一个编辑用户配置文件ViewController。在此页面上,它显示用户的名字和姓氏,电子邮件和电话号码以及图片。所有这些都已从Firebase中拉出,并且工作正常。您看到的“图片”是实际的JPG,当有人创建帐户时,该图片会“上传”,这样照片URL便存储在他们的数据库中,我可以检索它以显示照片。从理论上讲,当“编辑”个人资料时,用户会在其中看到真实的图片,并用他们拍摄或上传的图片“更改”。

我遇到的问题是,当我完成从图库中选择图片或从相机拍摄一张照片时,它可以正确关闭相机或图库,但是“ tableviewcell”消失了,我看不到图片或文本。奇怪的是,保留了不属于表的文本字段。目的是让“拍摄”的图片临时出现在UIImage视图(位于tableviewcell中)中,然后当用户单击“保存”时,它将上传到FireBase(我知道该怎么做)。然后,该VC将被关闭,ProfileVC中的数据将通过新图片从FireBase重新加载。

我已经降低了Firebase的部分,以及我正确地(我认为)对图像选择器进行了编码,但是关于为什么临时图像没有显示,我必须缺少一些东西。

作为其他故障排除步骤,我注释了以下一行: EditProfileVC.swift imagePickerContoller 函数下的 self.editProfileTable.reloadData() >文件。当我这样做时,在单击“选择照片”后,该视图消失了,它直接回到下面的更新图片之前图片。桌子上一定有东西,但我只是没有看到它。

我在下面包括了所有相关代码。

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()

}

Before Update Picture button is pressed

After Update Image button pressed and all code above is run

0 个答案:

没有答案