0

I have tableview listed pdfs by retrieving from Firebase. No problem with retrieving datas and sending default SMTP. What I am trying to do that selected urls(pdf) in tableview, will be sent by using SMTP to user email so that user can easily reach pdf urls. I could not figure out how to handle it. This is the only critical point in my project. Any help is appreciated.

  import UIKit
  import Firebase
  import PDFKit
  import skpsmtpmessage

  class IcsViewcontroller: UIViewController , UISearchBarDelegate,SKPSMTPMessageDelegate{

  var preImage : UIImage?

  let cellSpacingHeight: CGFloat = 20



  @IBOutlet weak var searchBar: UISearchBar!

  
  @IBOutlet weak var pdfListView: UITableView!

  @IBOutlet weak var spinner: UIActivityIndicatorView!

  var pdfList = [pdfClass]()
  var searchall = [pdfClass]()
  var searching = false
  var selectedPdf = [pdfClass]()

  override func viewDidLoad() {
    super.viewDidLoad()
    
  
  
   
    let editButton = UIBarButtonItem(title: "Edit", style: .plain, target: self,           action: #selector(showEditing(_:)))
        navigationItem.rightBarButtonItem = editButton
    pdfListView.delegate = self
    pdfListView.dataSource = self
    searchBar.delegate = self

    
        self.pdfListView.isHidden = true
   
    
    getPdf()
    
   sendEmail()
  
    
    searchBar.searchTextField.backgroundColor = .white

  }

   override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if let selectionIndexPath = self.pdfListView.indexPathForSelectedRow {
        self.pdfListView.deselectRow(at: selectionIndexPath, animated: animated)
    }
   }
  
   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   
   if searching {
        let destination = segue.destination as! PdfKitViewController
        let selectedIndexPath = pdfListView.indexPathForSelectedRow
        destination.pdf = searchall[selectedIndexPath!.row]
    } else {
        
        let destination = segue.destination as! PdfKitViewController
        let selectedIndexPath = pdfListView.indexPathForSelectedRow
        destination.pdf = pdfList [selectedIndexPath!.row]
       
        
      }
    
    }

   @objc func showEditing(_ sender: UIBarButtonItem)
    {
   if(self.pdfListView.isEditing == true)
   {
    
       self.pdfListView.isEditing = false
       self.navigationItem.rightBarButtonItem?.title = "Edit"
   }
   else
   {
    self.pdfListView.allowsMultipleSelectionDuringEditing = true
       self.pdfListView.isEditing = true
       self.navigationItem.rightBarButtonItem?.title = "Done"
   }
   }


  func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    
    if searchBar.text == nil || searchBar.text == "" {
               searching = false
           } else {
               searching = true
            
           }
    

   }

   func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searching = false
            searchBar.text = ""
            self.pdfListView.reloadData()
   
   }

   func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
   
    searching = false
    
   }


   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    

    
   if searchBar.text == nil || searchBar.text == "" {
        searchall = pdfList
        searching = false
        pdfListView.reloadData()
        
    } else {
        
        searching = true
    searchall =       pdfList.filter({($0.pdf_name?.lowercased().prefix(searchText.count))! ==  searchText.lowercased() })
        pdfListView.reloadData()
    }
    
    
}

func getPdf () {
    
   
    
    spinner.startAnimating()
    let docRef = Storage.storage().reference().child("ICS_Documents")
    
    docRef.listAll{ (result , error ) in
        
        if error != nil {
         
            let alert = UIAlertController(title: "Error", message: "No Database      Connection", preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "OK", style:     UIAlertAction.Style.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
            self.spinner.stopAnimating()
            
        }
    
        for item in result.items {
            
            
            let storeageLocation = String( describing : item)
            
            let gsReference = Storage.storage().reference(forURL: storeageLocation)
            
            gsReference.downloadURL{ url , error in

                
                if let error = error{
                    
                    print(error)
                } else {
                    
                    let pdf_name = String( item.name)
                    let pdf_url = url?.absoluteString
                
                   
                    let thumbnailSize = CGSize(width: 100, height: 100)
                    
       
 let thmbnail = self.generatePdfThumbnail(of: thumbnailSize,  for: url!, atPage: 0)
                
                    
    let pdfall = pdfClass(pdf_name: pdf_name, pdf_url: pdf_url!,  pdf_preview: thmbnail!)
                    
                    self.pdfList.append(pdfall)
            
                }
               
               
                
                DispatchQueue.main.async {
                    self.pdfList.sort{ $0.pdf_name ?? "" < $1.pdf_name ?? ""}
                    self.pdfListView.reloadData()
                    self.spinner.stopAnimating()
                    self.pdfListView.isHidden = false
                    
                    
                }
            }
            
        }
        
        
    }
     
    
   }
  func generatePdfThumbnail(of thumbnailSize: CGSize , for documentUrl: URL, atPage   

  pageIndex: Int) -> UIImage? {
    let pdfDocument = PDFDocument(url: documentUrl)
    let pdfDocumentPage = pdfDocument?.page(at: pageIndex)

    return pdfDocumentPage?.thumbnail(of: thumbnailSize, for:   
   PDFDisplayBox.trimBox)
    }

    func sendEmail() {
     
    
     let message = SKPSMTPMessage()
     message.relayHost = "smtp.gmail.com"
     message.login = "xxx@gmail.com"
     message.pass = "******"
     message.requiresAuth = true
     message.wantsSecure = true
     message.relayPorts = [587]
     message.fromEmail = "xxxx@gmail.com"
     message.toEmail = "xxxx@gmail.com"
     message.subject = "subject"
     
      let messagePart = [kSKPSMTPPartContentTypeKey: "text/plain; charset=UTF-8",   
      kSKPSMTPPartMessageKey: "Hi alll"]
     message.parts = [messagePart]
     message.delegate = self
     message.send()
     }

     func messageSent(_ message: SKPSMTPMessage!) {
     print("Successfully sent email!")
     }

    func messageFailed(_ message: SKPSMTPMessage!, error: Error!) {
     print("Sending email failed!")
     }
 

      }
     extension IcsViewcontroller : UITableViewDelegate,UITableViewDataSource{

   func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
      {
    
  if searching{
        return searchall.count
    }else {
    return pdfList.count
       
    }
    
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->   UITableViewCell {
    
     let cell = tableView.dequeueReusableCell(withIdentifier: "pdfCell", for:    indexPath) as! pdfCellTableViewCell
   
   let varcell : pdfClass
    
    if searching {
       varcell = searchall [indexPath.row]
        
    } else {
       varcell = pdfList [indexPath.row]
        
    }
        cell.configure(name: varcell.pdf_name! , pdfthumbnail:  varcell.pdf_preview!)
    cell.accessoryType = .disclosureIndicator
    return cell

    
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   
   var indx : pdfClass
    if searching{
        indx = searchall[indexPath.row ]
        
    }else {
        indx = pdfList[indexPath.row]
    
    }
    
    self.selectdeselectcell(tableview: tableView, indexpath: indexPath)
    print("selected")
    
    if pdfListView.isEditing {
        func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) ->     Bool {
           
            return !tableView.isEditing 
        }
    }else{
    performSegue(withIdentifier: "toPdfKit", sender: indx)
    print(indexPath.row)
    }
}
    
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)        {
        self.selectdeselectcell(tableview: tableView, indexpath: indexPath)
        print("deselected")
    }
    func selectdeselectcell(tableview : UITableView ,indexpath : IndexPath){
        if pdfListView.isEditing{
        self.selectedPdf.removeAll()
        if let arr = pdfListView.indexPathForSelectedRow{
           
           print(arr)
       }
        }else {
            return
        }
    }
    
 

   /* func tableView(_ tableView: UITableView, editActionsForRowAt indexPath:  IndexPath) -> [UITableViewRowAction]? {
    
    let deleteAction = UITableViewRowAction(style: .default, title: "Delete",   handler: { (action:UITableViewRowAction,indexPath:IndexPath)-> Void in
       
        let storage = Storage.storage()
        var childsURL : String
        if self.searching {
            
            childsURL = self.searchall[indexPath.row ].pdf_url!
        }else{
        childsURL = self.pdfList[indexPath.row].pdf_url!
        }
        let storageref = storage.reference(forURL: childsURL)
        
        storageref.delete{ error in
            if let error = error {
                print(error.localizedDescription)
                
            } else{
                print("File deleted")
                
            }
            
            
        }
        self.pdfList.removeAll()
        self.getPdf()
        
        
    })
        
    return [deleteAction]
    
    
     }*/

    }
aig_88
  • 13
  • 7
  • Why not share the url via the share menu ? – Ptit Xav Oct 06 '21 at 17:36
  • @PtitXav What do you mean "the share menu" ? Could you give more information ? I am a bit newbie iOS developer. – aig_88 Oct 06 '21 at 18:13
  • You can find example on internet (try : adding a share button to a swift app) and in this [post](https://stackoverflow.com/questions/35931946/basic-example-for-sharing-text-or-image-with-uiactivityviewcontroller-in-swift). – Ptit Xav Oct 06 '21 at 18:27
  • @PtitXav sorry but this is not the way that I want. Let me explain my project. The app will be used In exhibition. The guests will review the catalogs (listed as pdf in tableview) using IPAD and the catalogs they want to review later will be sent their email address via SMTP. The part that I have difficulty is that I can not get selected item in editing mode. whenever I select more than one pdf, I get only first pdf in the list. – aig_88 Oct 06 '21 at 21:11

0 Answers0