From 574b8ff0ec1875b775149e3a96ea9931a55efe28 Mon Sep 17 00:00:00 2001 From: Julio Hermosa Date: Mon, 18 May 2020 12:19:38 -0400 Subject: [PATCH] -Se corrigen errores de persistencia de datos en coredata (los cambios de iconos de los pines, botones, etc al actualizarse la base de datos) -Se agrego la función de eliminar favoritos de mis pendientes scrolleando la celda o al pulsar el botón de quitar de favoritos -Se implementa funciones para obtener día, mes y año de las fechas, manipulándolos como strings -Se corrigen algunos detalles de diseño --- ayudapy.xcworkspace/contents.xcworkspacedata | 4 ++-- ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate | Bin 130148 -> 0 bytes ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist | 21 +++++++++++++++++++++ ayudapy/Base.lproj/Main.storyboard | 126 ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------ ayudapy/CoreData/CoreDataManager.swift | 14 +++++++++++--- ayudapy/CoreData/Favorites.xcdatamodeld/favoriteRequests.xcdatamodel/contents | 2 +- ayudapy/ViewControllers/MapViewController.swift | 32 ++++++++++++++++++++++---------- ayudapy/ViewControllers/MyPendingsTableViewCell.swift | 12 +++++++----- ayudapy/ViewControllers/PendingsViewController.swift | 52 +++++++++++++++++++++++++++++++++------------------- ayudapy/ViewControllers/RequestViewController.swift | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------- 10 files changed, 240 insertions(+), 162 deletions(-) diff --git a/ayudapy.xcworkspace/contents.xcworkspacedata b/ayudapy.xcworkspace/contents.xcworkspacedata index 7b53a9d..ca52a46 100644 --- a/ayudapy.xcworkspace/contents.xcworkspacedata +++ b/ayudapy.xcworkspace/contents.xcworkspacedata @@ -2,10 +2,10 @@ + location = "group:ayudapy/CoreData/Entity+CoreDataClass.swift"> + location = "group:ayudapy/CoreData/Entity+CoreDataProperties.swift"> diff --git a/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate b/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate index 460ebbf..767afab 100644 Binary files a/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate and b/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 69ba14e..90eeaaf 100644 --- a/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/ayudapy.xcworkspace/xcuserdata/roshka.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,4 +3,25 @@ uuid = "39C5608C-6BDA-4DA8-94F3-02BAE7D82DBB" type = "0" version = "2.0"> + + + + + + + + + + diff --git a/ayudapy/Base.lproj/Main.storyboard b/ayudapy/Base.lproj/Main.storyboard index e900d42..d5a5790 100644 --- a/ayudapy/Base.lproj/Main.storyboard +++ b/ayudapy/Base.lproj/Main.storyboard @@ -56,98 +56,68 @@ - - + + - - + + - - - - - - - - - - - - - - - + + - - - - - - - - + + - + + + + + + + + - - - - - - + + + + - - - + - - - - + + + + - - - - - - - diff --git a/ayudapy/CoreData/CoreDataManager.swift b/ayudapy/CoreData/CoreDataManager.swift index d3cb26c..7a525ec 100644 --- a/ayudapy/CoreData/CoreDataManager.swift +++ b/ayudapy/CoreData/CoreDataManager.swift @@ -25,15 +25,16 @@ class CoreDataManager { } } - func saveFavorites(id: Int, name: String, date: Date, address: String, message: String, completion: @escaping()-> Void){ + func saveFavorites(id: Int, name: String, date: String, address: String, message: String, title: String, phoneNumber: String, completion: @escaping()-> Void){ let context = container.viewContext let favorite = Entity(context: context) - //let ifavorite = MyPendings(context: context) favorite.id = Int64(id) favorite.name = name favorite.date = date favorite.address = address favorite.message = message + favorite.title = title + favorite.phoneNumber = phoneNumber do{ try context.save() print("\(id) guardado") @@ -46,7 +47,14 @@ class CoreDataManager { let context = container.viewContext for i in 0.. - + diff --git a/ayudapy/ViewControllers/MapViewController.swift b/ayudapy/ViewControllers/MapViewController.swift index 4b4ddc9..2cae8d9 100644 --- a/ayudapy/ViewControllers/MapViewController.swift +++ b/ayudapy/ViewControllers/MapViewController.swift @@ -23,14 +23,10 @@ class MapViewController: UIViewController { var bbox = String() var id = Int() - let defaultLocation = CLLocation(latitude: -57.5879897, longitude: -43.2723609) //-57.5879897,-43.2723609 -> Posición de Roshka - func addPins(){ - - } - + //logo cabecera ayudapy.org func addHeader(){ @@ -112,9 +108,12 @@ class MapViewController: UIViewController { @objc func goToRequestViewController(pk: Int){ let pedidosVC = self.storyboard?.instantiateViewController(withIdentifier: "pedidosVC")as! RequestViewController pedidosVC.id = id - print(id) + print("ID del pedido: \(id)") pedidosVC.helpRequest() - show(pedidosVC, sender: nil) + //show(pedidosVC, sender: nil) + isModalInPresentation = true + present(pedidosVC, animated: true, completion: nil) + } //Función para hallar el boundingbox actual @@ -142,9 +141,9 @@ class MapViewController: UIViewController { let markerView = UIView(frame: CGRect(x: 0, y: 0, width: 24, height: 30)) let markerButton = UIButton(frame: CGRect(x: 0, y: 0, width: 24, height: 30)) markerView.addSubview(markerButton) - markerButton.addTarget(self, action: #selector(self.goToInfo), for: .touchUpInside) - let markerImage = UIImage(named: "pinGMAPS") - markerButton.setImage(markerImage, for: .normal) + markerButton.addTarget(self, action: #selector(self.goToInfo), for: .touchUpInside) + let pin = self.addPins(id: self.id) + markerButton.setImage(pin, for: .normal) let marker = GMSMarker(position: position) marker.map = self.mapView @@ -172,6 +171,19 @@ class MapViewController: UIViewController { mapView.isHidden = true } + + //Verificamos si el marcador corresponde a un favorito y agregamos la imagen correspondiente + func addPins(id: Int)->UIImage{ + let array = manager.fetchFavorites() + var pinImage = UIImage(named: "pinGMAPS") + for i in 0 ..< array.count{ + if array[i].id == Int64(id) { + pinImage = UIImage(named: "pinFavGMAPS") + } + } + return pinImage! + } + override func viewDidLoad() { super.viewDidLoad() diff --git a/ayudapy/ViewControllers/MyPendingsTableViewCell.swift b/ayudapy/ViewControllers/MyPendingsTableViewCell.swift index 33c3907..1879642 100644 --- a/ayudapy/ViewControllers/MyPendingsTableViewCell.swift +++ b/ayudapy/ViewControllers/MyPendingsTableViewCell.swift @@ -13,16 +13,18 @@ class MyPendingsTableViewCell: UITableViewCell { var id = Int() let format = Format.init() let manager = CoreDataManager() + var array = [Entity]() + @IBOutlet weak var dayLabel: UILabel! @IBOutlet weak var monthLabel: UILabel! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var detailLabel: UILabel! @IBOutlet weak var deleteButton: UIButton! - @IBAction func deleteRow(_ sender: Any) { - let array = manager.fetchFavorites() - print(id) - manager.deleteFavorites(id: id, array: array) - } +// @IBAction func deleteRow(_ sender: Any) { +// array = manager.fetchFavorites() +// print(id) +// manager.deleteFavorites(id: id, array: array) +// } diff --git a/ayudapy/ViewControllers/PendingsViewController.swift b/ayudapy/ViewControllers/PendingsViewController.swift index 5850866..6c2b8ac 100644 --- a/ayudapy/ViewControllers/PendingsViewController.swift +++ b/ayudapy/ViewControllers/PendingsViewController.swift @@ -11,9 +11,10 @@ import CoreData struct MyPendings{ var id: Int + var title: String? var message: String? - var date: String + var date: String? var address: String? var contactNumber: String? var contactName: String? @@ -21,7 +22,9 @@ struct MyPendings{ class PendingsViewController: UIViewController { + let manager = CoreDataManager() + var array = [Entity]() var myPendings = [MyPendings]() let format = Format.init() @@ -29,11 +32,12 @@ class PendingsViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - let array = manager.fetchFavorites() - - for i in 0.. UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyPendingsTableViewCell - let date = myPendings[indexPath.row].date - let month = date.getDatePart(dateUnit: .month) + let date = array[indexPath.row].date + let month = date!.getDatePart(dateUnit: .month) let monthString = month.getMonthShortString() - let day = date.getDatePart(dateUnit: .day) + let day = date!.getDatePart(dateUnit: .day) var detailLabel:String = "" - cell.titleLabel.text = myPendings[indexPath.row].title + cell.titleLabel.text = array[indexPath.row].title cell.titleLabel.textColor = format.subTitleTextColor cell.titleLabel.font = format.subTitleFontStyle - if let address = myPendings[indexPath.row].address { + if let address = array[indexPath.row].address { detailLabel = address } - if let contactName = myPendings[indexPath.row].contactName { + if let contactName = array[indexPath.row].name { detailLabel = detailLabel + "\n\(contactName)" } - if let contactNumber = myPendings[indexPath.row].contactNumber { + if let contactNumber = array[indexPath.row].phoneNumber { detailLabel = detailLabel + "\n\(contactNumber)" } cell.detailLabel.text = detailLabel @@ -74,9 +78,9 @@ extension PendingsViewController: UITableViewDelegate, UITableViewDataSource{ cell.dayLabel.text = day cell.monthLabel.text = monthString - let id = myPendings[indexPath.row].id - cell.id = id - + let id = array[indexPath.row].id + cell.id = Int(id) + return cell } @@ -87,12 +91,22 @@ extension PendingsViewController: UITableViewDelegate, UITableViewDataSource{ headerLabel.textAlignment = .center let centerX = view.frame.width / 2 headerLabel.center.x = centerX - let heartImage = UIImageView(frame: CGRect(x: centerX + 60, y: 10, width: 22, height: 22)) + let heartImage = UIImageView(frame: CGRect(x: centerX + 100, y: 10, width: 22, height: 22)) heartImage.center.y = headerLabel.frame.height/2 heartImage.image = UIImage(named: "iconPendientesChecked") headerLabel.addSubview(heartImage) return headerLabel } - - + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + switch editingStyle { + case .delete: + manager.deleteFavorites(id: Int(array[indexPath.row].id), array: array) + array.remove(at: indexPath.row) + tableView.deleteRows(at: [indexPath], with: .fade) + + default: + print("no pasa nada") + } + } + } diff --git a/ayudapy/ViewControllers/RequestViewController.swift b/ayudapy/ViewControllers/RequestViewController.swift index 115c476..d865665 100644 --- a/ayudapy/ViewControllers/RequestViewController.swift +++ b/ayudapy/ViewControllers/RequestViewController.swift @@ -8,6 +8,7 @@ import UIKit import Kingfisher +import CoreData class RequestViewController: UIViewController { var id = Int() @@ -26,12 +27,18 @@ class RequestViewController: UIViewController { var favorites = [Int]() private let manager = CoreDataManager() + let isFavoriteButton = UIButton() + let isFavoriteLabel = UILabel() + let checkButton = UIButton() + let checkImage = UIImage(named: "iconListoUnchecked") + let checkLabel = UILabel() + func helpRequest(){ let url = "https://ayudapy.org/api/v1/helprequests/" HTTPClient.request(endpoint: url + "\(id)", onSuccess: { (response: Request?) in if let requestInformation = response{ - print("asdf\(requestInformation)") + print("Estos son los datos\(requestInformation)") self.name = response!.name self.message = response!.message self.hRequestTitle = response!.title @@ -40,6 +47,7 @@ class RequestViewController: UIViewController { self.phoneNumber = response!.phone self.address = response!.address self.imageUrl = response!.picture + self.isFavorite = self.isFavoriteCheck() self.showRequestInformation() } else { @@ -50,6 +58,8 @@ class RequestViewController: UIViewController { } func showRequestInformation(){ + var viewHeightAnchor = 0 + //let dateToString = "\(date)" let day = date.getDatePart(dateUnit: .day) let month = (date.getDatePart(dateUnit: .month)).getMonthInSpanish() let year = date.getDatePart(dateUnit: .year) @@ -74,7 +84,13 @@ class RequestViewController: UIViewController { imageView.kf.indicatorType = .activity imageView.kf.setImage(with: URL(string: imageUrl!)) } + let headerStackView = UIStackView(arrangedSubviews: [dateLabel, titleLbl, messageLabel]) + headerStackView.axis = .vertical + headerStackView.spacing = 5 + headerStackView.distribution = .equalSpacing + viewHeightAnchor += Int(headerStackView.frame.height) + //Dirección y como llegar let addressSubTittle = UILabel() addressSubTittle.text = "Dirección" addressSubTittle.textColor = format.subTitleTextColor @@ -83,32 +99,49 @@ class RequestViewController: UIViewController { addressLabel.text = "\(address)" addressLabel.lineBreakMode = .byWordWrapping addressLabel.numberOfLines = .max - let howToGetButton = UIButton() howToGetButton.backgroundColor = format.subTitleTextColor howToGetButton.layer.cornerRadius = 10 - howToGetButton.setTitle("Como llegar", for: .normal) howToGetButton.titleLabel?.font = format.subTitleFontStyle + let addressStackView = UIStackView(arrangedSubviews: [addressSubTittle, addressLabel, howToGetButton]) + addressStackView.axis = .vertical + addressStackView.spacing = 5 + viewHeightAnchor += Int(addressStackView.frame.height) + + //Información del Contacto let contactLabel = UILabel() contactLabel.text = "Contacto" contactLabel.textColor = format.subTitleTextColor contactLabel.font = format.subTitleFontStyle let contactNameLabel = UILabel() contactNameLabel.text = "\(name)" - let contactButton = UIButton() - contactButton.backgroundColor = format.subTitleTextColor - contactButton.titleLabel?.font = format.subTitleFontStyle - contactButton.layer.cornerRadius = 10 - contactButton.setTitle("\(phoneNumber)", for: .normal) + let contactNumberButton = UIButton() + contactNumberButton.backgroundColor = format.subTitleTextColor + contactNumberButton.titleLabel?.font = format.subTitleFontStyle + contactNumberButton.layer.cornerRadius = 10 + contactNumberButton.setTitle("\(phoneNumber)", for: .normal) + let contactInformationStackView = UIStackView(arrangedSubviews: [contactLabel, contactNameLabel, contactNumberButton]) + contactInformationStackView.axis = .vertical + contactInformationStackView.spacing = 5 + viewHeightAnchor += Int(contactInformationStackView.frame.height) + + + //checkButton.frame.size = CGSize(width: 80, height: 80) + checkLabel.text = "Marcar como listo" + checkLabel.font = format.bodyFontStyle + checkLabel.textAlignment = .center + + let checkStackView = UIStackView(arrangedSubviews: [checkButton, checkLabel]) + checkStackView.axis = .vertical + checkStackView.distribution = .fillEqually + checkStackView.spacing = 0 - let isFavoriteButton = UIButton() - let heartImage = UIImage(named: "iconPendientesUnchecked") - isFavoriteButton.setImage(heartImage, for: .normal) + //isFavoriteButton.setImage(heartImage, for: .normal) isFavoriteButton.frame.size = CGSize(width: 80, height: 80) - isFavoriteButton.addTarget(self, action: #selector(addFavorite), for: .touchUpInside) + isFavoriteButton.setImage(UIImage(named: "iconPendientesUnchecked"), for: .normal) + isFavoriteButton.addTarget(self, action: #selector(addOrRemoveFavorite(sender: )), for: .touchUpInside) - let isFavoriteLabel = UILabel() isFavoriteLabel.text = "Agregar a mis pendientes" isFavoriteLabel.font = format.bodyFontStyle isFavoriteLabel.numberOfLines = 2 @@ -118,54 +151,70 @@ class RequestViewController: UIViewController { isFavoriteStackView.distribution = .fillEqually isFavoriteStackView.spacing = 0 - let checkButton = UIButton() - let checkImage = UIImage(named: "iconListoUnchecked") - checkButton.setImage(checkImage, for: .normal) - checkButton.frame.size = CGSize(width: 80, height: 80) - let checkLabel = UILabel() - checkLabel.text = "Marcar como listo" - checkLabel.font = format.bodyFontStyle - checkLabel.textAlignment = .center + checkButton.setImage(checkImage, for: .normal) - let checkStackView = UIStackView(arrangedSubviews: [checkButton, checkLabel]) - checkStackView.axis = .vertical - checkStackView.distribution = .fillEqually - checkStackView.spacing = 0 let footerStackView = UIStackView(arrangedSubviews: [isFavoriteStackView, checkStackView]) footerStackView.axis = .horizontal footerStackView.distribution = .fillEqually - footerStackView.spacing = 50 - //let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)) - let footerSpacing = UIView() + footerStackView.heightAnchor.constraint(equalToConstant: 100).isActive = true + viewHeightAnchor += Int(isFavoriteStackView.frame.height) + viewHeightAnchor += 30 - let stackView = UIStackView(arrangedSubviews: [dateLabel, titleLbl, messageLabel, addressSubTittle, addressLabel,howToGetButton,contactLabel,contactNameLabel, contactButton, footerStackView, footerSpacing]) + let stackView = UIStackView(arrangedSubviews: [headerStackView, addressStackView, contactInformationStackView, footerStackView]) stackView.axis = .vertical - stackView.distribution = .fillProportionally + stackView.distribution = .equalSpacing stackView.spacing = 10 - stackView.layer.frame = CGRect(x: 20, y: 20, width: view.frame.width * 0.9, height: view.frame.height * 0.9) - //view.addSubview(scrollView) + stackView.layer.frame = CGRect(x: 20, y: 20, width: view.frame.width * 0.9, height: view.frame.height*0.9) + //stackView.heightAnchor.constraint(equalToConstant: CGFloat(viewHeightAnchor)).isActive = true + //stackView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.9).isActive = true + //let scrollView = UIScrollView() + //scrollView.heightAnchor.constraint(equalToConstant: view.frame.height).isActive = true + //scrollView.widthAnchor.constraint(equalToConstant: view.frame.width).isActive = true //scrollView.addSubview(stackView) + + //view.addSubview(scrollView) view.addSubview(stackView) - //view.addSubview(titleLbl) } func isFavoriteCheck()->Bool{ - - return false + let favoritos = manager.fetchFavorites() + var bool = false + for i in 0 ..< favoritos.count { + if favoritos[i].id == Int64(id) { + bool = true + } + else { + bool = false + } + } + return bool } + func isReadyCheck()->Bool{ return false } - func convertDate(stringDate: String)->Date{ - let dateFormatter = Date() - //dateFormatter.date(from: "stringDate") - return dateFormatter - } - - @objc func addFavorite(){ - manager.saveFavorites(id: id, name: name, date: convertDate(stringDate: date), address: address, message: hRequestTitle) { [weak self] in - print(self as Any) + + @objc func addOrRemoveFavorite(sender: UIButton){ + + let favorites = manager.fetchFavorites() + if isFavorite { + print("estaba guardado") + manager.deleteFavorites(id: id, array: favorites) + self.isFavorite = false + sender.setImage(UIImage(named: "iconPendientesUnchecked"), for: .normal) + self.isFavoriteLabel.text = "Agregar a mis Pendientes" + }else + { + print("se tiene que guardar") + + manager.saveFavorites(id: id, name: name, date: date, address: address, message: message, title: hRequestTitle, phoneNumber: phoneNumber) { [weak self] in + print("\(self as Any) guardado!") + self?.isFavorite = true + } + self.isFavorite = true + sender.setImage(UIImage(named: "iconPendientesChecked"), for: .normal) + self.isFavoriteLabel.text = "Quitar de mis Pendientes" } } @@ -174,3 +223,5 @@ class RequestViewController: UIViewController { } } + + -- libgit2 0.26.0