2017-12-15 2 views
0

Auf der Suche nach etwas Hilfe oder einem Anstupsen in die richtige Richtung, wie ich nicht scheinen kann, diese herauszufinden. Ich versuche, den Text von der E-Mail-Bezeichnung, die ich in einer benutzerdefinierten Tabellenansicht-Zelle habe, in eine andere VC zu bekommen, wo ich ein Kontaktformular haben werde. Ich habe eine Schaltfläche in der Tabellenansicht Zelle, also idealerweise würde dies in eine neue VC überleiten, wo ich Zugriff auf das E-Mail-Feld aber für diese bestimmte Zelle haben. Ich habe mit der Preparetoseugue-Funktion betrachtet, um den indexpath.row-Index dafür zu bringen, hatte aber bisher kein Glück.Daten von einer benutzerdefinierten Tabellenansichtszelle zu einer anderen VC abrufen?

Dies ist meine benutzerdefinierte Tableview Zelle:

// 
// RentalCell.swift 
// Login 
// 
// Created by George Woolley on 02/12/2017. 
// Copyright © 2017 George Woolley. All rights reserved. 
// 

import UIKit 
import Foundation 
import Firebase 
import MessageUI 

class RentalCell: UITableViewCell, MFMailComposeViewControllerDelegate { 
    var rental: Rental! 

    @IBOutlet weak var rentalTitleLbl: UILabel! 
    @IBOutlet weak var rentalPriceLbl: UILabel! 
    @IBOutlet weak var rentalTypeLbl: UILabel! 
    @IBOutlet weak var bondLbl: UILabel! 
    @IBOutlet weak var rentLbl: UILabel! 
    @IBOutlet weak var dateAvalLbl: UILabel! 
    @IBOutlet weak var petsLbl: UILabel! 
    @IBOutlet weak var descriptionLbl: UILabel! 
    @IBOutlet weak var emailField: UILabel! 
    @IBOutlet weak var rentalImage: UIImageView! 

    func configureCell(rental: Rental, image: UIImage?) { 
     self.rental = rental 

     self.rentalTitleLbl.text = rental.title 
     self.rentalPriceLbl.text = rental.price 
     self.rentalTypeLbl.text = rental.rentalType 
     self.bondLbl.text = rental.bond 
     self.rentLbl.text = rental.price 
     self.dateAvalLbl.text = rental.dateAval 
     self.petsLbl.text = rental.pets 
     self.descriptionLbl.text = rental.description 
     self.emailField.text = rental.email 

     if image != nil { 
      //Image already in cache 
      self.rentalImage.image = image 
     } else { 
      // download image from Firebase 
      let ref = Storage.storage().reference(forURL: rental.imageURL!) 
      ref.getData(maxSize: 2 * 1024 * 1024, completion: { (data, error) in 
       if error != nil { 
        print("An error has occured downloading image") 
       } else { 
        print("Image downloaded") 
        if let imageData = data { 
         if let img = UIImage(data: imageData) { 
          self.rentalImage.image = img 
          RentalTableViewVC.imageCache.setObject(img, forKey: rental.imageURL! as NSString) 
         } 
        } 
       } 
      }) 
     } 
    } 
} 

Das ist mein tableViewVC ist:

// 
// MainVC.swift 
// Login 
// 

import UIKit 
import Firebase 
import FirebaseDatabase 

class AvertisingVC: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    @IBOutlet weak var titleField: UITextField! 
    @IBOutlet weak var dateAvalField: UITextField! 
    @IBOutlet weak var rentalTypeField: UITextField! 
    @IBOutlet weak var petsField: UITextField! 
    @IBOutlet weak var furnishedField: UITextField! 
    @IBOutlet weak var bondField: UITextField! 
    @IBOutlet weak var rentField: UITextField! 
    @IBOutlet weak var descriptionField: UITextView! 
    @IBOutlet weak var addImage: UIImageView! 
    @IBOutlet weak var emailField: UITextField! 

    var imageSelected = false 
    let datePicker = UIDatePicker() 
    var imagePicker: UIImagePickerController! 
    var databaseRef:DatabaseReference? //reference to firebase dba 
    let rentalTypes = ["Room in shared house", "Entire House","Room Share", "Apartment", "Cottage", "Other"] 
    let petsAllowed = ["Yes", "No"] 
    let rentalTypePicker = UIPickerView() 
    let petsAllowedPicker = UIPickerView() 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return rentalTypes.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return rentalTypes[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     rentalTypeField.text = rentalTypes[row] 
     rentalTypeField.resignFirstResponder() 
    } 

    func createDatePicker() { 
     //toolbar 
     let toolbar = UIToolbar() 
     toolbar.sizeToFit() 
     //done button 
     let done = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(datePickerDonePressed)) 
     toolbar.setItems([done], animated: false) 
     //add picker to text field 
     dateAvalField.inputAccessoryView = toolbar 
     dateAvalField.inputView = datePicker 
     //format picker for date 
     datePicker.datePickerMode = .date 
    } 

    @objc func datePickerDonePressed() { 
     //formate date 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .medium 
     dateFormatter.timeStyle = .none 
     let dateString = dateFormatter.string(from: datePicker.date) 
     dateAvalField.text = "\(dateString)" 
     self.view.endEditing(true) 
    } 

    func setupRentalTypePicker() { 
     rentalTypeField.inputView = rentalTypePicker 
     rentalTypePicker.dataSource = self 
     rentalTypePicker.delegate = self 

     rentalTypeField.textAlignment = .center 
     rentalTypeField.placeholder = "Select rental type" 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let image = info[UIImagePickerControllerEditedImage] as? UIImage { 
      addImage.image = image 
      imageSelected = true 
     } else { 
      print("Invalid image from picker") 
     } 
     imagePicker.dismiss(animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     imagePicker = UIImagePickerController() 
     imagePicker.allowsEditing = true 
     imagePicker.delegate = self 

     //Firebase Ref 
     databaseRef = Database.database().reference().child("Rentals") //can add .child(string:root) to add root dir to dba 
     //Date Picker 
     createDatePicker() 
     //rentalTypePicker 
     setupRentalTypePicker() 
    } 

    @IBAction func backBtnPressed(_ sender: Any) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    @IBAction func submitForm(_ sender: Any) {  // Send data to firebase on submit 

     guard let img = addImage.image, imageSelected == true else { 

      let alert = UIAlertController(title: "You must upload one image to proceed", message: "It's recommended you upload one image before continuing.", preferredStyle: .alert) 

      alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) 

      self.present(alert, animated: true) 

      return 
     } 

     //Upload image with unique ID as a key 
     if let imageData = UIImageJPEGRepresentation(img, 0.2) { 

      let imageUID = UUID().uuidString 
      let metaData = StorageMetadata() 
      metaData.contentType = "image/jpeg" 

      DataService.ds.StorageREF.child(imageUID).putData(imageData, metadata: metaData) { (metadata, error) in 
       if error != nil { 
        print("Error occured uploading data to firebase") 
       } else { 
        print("Successfully uploaded image") 

        let downloadURL = metadata?.downloadURL()?.absoluteString 

        if let url = downloadURL { 
         self.postDataToFirbase(imgURL: url) 
        } 
       } 
      } 
     } 

     let alertController = UIAlertController(title: "Success!", message: "You have successfully listed a rental", preferredStyle: .alert) 
     let defaultAction = UIAlertAction(title: "Close Alert", style: .default, handler: nil) 
     alertController.addAction(defaultAction) 

     present(alertController, animated: true, completion: nil) 
    } 

    func postDataToFirbase(imgURL: String) { 
     let data: Dictionary<String, AnyObject> = [ 
     "title": titleField.text as AnyObject, 
     "price": rentField.text as AnyObject, 
     "description": descriptionField.text as AnyObject, 
     "bond": bondField.text as AnyObject, 
     "date": dateAvalField.text as AnyObject, 
     "type": rentalTypeField.text as AnyObject, 
     "pets": petsField.text as AnyObject, 
     "imageURL": imgURL as AnyObject, 
     "email": emailField.text as AnyObject 
     ] 

     //Post data 
     let postDataTo = DataService.ds.DBrefRentals.childByAutoId() 
     postDataTo.setValue(data) 
     //Clear screen 
     titleField.text = "" 
     rentField.text = "" 
     descriptionField.text = "" 
     bondField.text = "" 
     rentalTypeField.text = "" 
     dateAvalField.text = "" 
     petsField.text = "" 
     furnishedField.text = "" 
     emailField.text = "" 
     addImage.image = #imageLiteral(resourceName: "house") 
    } 

    @IBAction func addImagePressed(_ sender: Any) { 
     present(imagePicker, animated: true, completion: nil) 
    } 
} 
+0

Mögliche Duplikat [Geben von Daten zwischen View-Controller] (https://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – the4kman

+0

Nur eine Anmerkung zu Ihrer Betreffzeile .... Sie sollten nie in Bezug auf Daten von visuellen Elementen Ihrer App, außer zu denken wenn es ein einfaches Datenmodell ist Datum als Reaktion auf die Bearbeitung durch den Benutzer. Wenn Sie nach einer Informationsquelle suchen, die Sie weitergeben möchten, rufen Sie sie aus dem Objekt "Rental" ab, das Ihrer Zelle entspricht. –

+0

Danke Phillip. Das ist wirklich, was ich gesucht habe. Ich wusste, was ich versuchte, war eher ein Workaround-/Hacky-Ansatz, habe herausgefunden, wie man den Wert des Indexpfads durchläuft, um den Wert aus dem Mietobjekt zu erhalten. –

Antwort

0

Deklarieren Sie eine Variable in der "Sender" Klasse Beispiel: var valueName: String? Das nächste, was ist zu schaffen eine Vorbereitung für den Übergang Beispiel:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.destination is ValuesTableViewController 
    { 
     let vc = segue.destination as? ValuesTableViewController 
     vc?.valueName = "Some string u want to send" 
    } 
} 

Wo ValuesTableViewController die Empfänger-View-Controller-Klasse

Letzte Sache ist, dass Segue Methode im Code zu tun ist, rufen, wo u den Benutzer zum nächsten Bildschirm umleiten möchten.

Beispiel:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let cell = tableView.cellForRow(at: indexPath) as! UnitTableViewCell 
    if let valueName = cell.valueLabel.text { 
     print(valueName) 
     sendingName = valueName 
     if let color = cell.leftColorView.backgroundColor { 
      sendingColor = color 
     } 
     self.performSegue(withIdentifier: "goToValues", sender: self) 
    }  
} 

Wenn der Benutzer klickt auf einer Zelle in Tableview Sie ihn zum nächsten Bildschirm umzuleiten, ist dies nur ein Beispiel u dies auch in anderen Situationen nutzen kann.

Letzter Schritt: In dem Empfänger machen Viewcontroller eine Variable

var valueName: String? 

und dann kann es u verwenden, wo immer u wie

Glücklich Coding

Verwandte Themen