我遇到了一个非常奇怪的问题,在开发过程中从未见过。由于应用程序没有崩溃且控制台窗口中没有错误的调试输出,因此很难进行故障排除。
我有一个编辑用户配置文件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()
}