2016-04-06 8 views
0

Ich habe eine UITabView in UIViewController, alle Registerkartenelemente sind mit anderen UIViewControllern verknüpft. Ich habe einen schnellen Code zum Herunterladen einer Datei über das Internet geschrieben. wenn ich zweite TabItem wähle, läuft dieser Code gut, er lädt die heruntergeladene Datei herunter und zeigt eine Vorschau an. Wenn ich dann auf das erste TabItem klicke und dann erneut auf das zweite TabItem klicke; Datei-Downloads gut, aber es zeigt keine Vorschau statt xCode gibt mir eine Warnmeldung: Was ich will, ist Download-Datei und Vorschau-Datei sollten beide funktionieren, wenn ich erneut auf das zweite TabItem klicken. was auch immer der Code ist.Warnung: Versuch darzustellen, wessen Sicht nicht in der Fensterhierarchie ist

Warnung: Versuch QLPreviewController auf KPIViewController deren Ansicht zu präsentieren ist nicht in der Fensterhierarchie

ich viele Lösungen im Internet gefunden haben, aber es hat nicht funktioniert

erste Lösung sagt verwenden

let viewer = UIDocumentInteractionController(URL: NSURL(fileURLWithPath: path)) 
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(viewer, animated: true, completion: nil) 

aber diese Funktion

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(viewer, animated: true, completion: nil) 

nicht akzeptieren UIDocumentInteractionController

zweite Lösung, sagt die bestehende presentViewController Funktion

override func presentViewController(viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?) { 

     let APP_DELEGATE = UIApplication.sharedApplication().delegate 
     var presentedModalVC:UIViewController = (APP_DELEGATE!.window?!.rootViewController?.presentedViewController)! 

     if presentedModalVC == true { 

      while((presentedModalVC.presentedViewController) != nil){ 

       presentedModalVC = presentedModalVC.presentedViewController! 
      } 
      presentedModalVC.presentViewController(viewControllerToPresent, animated: flag, completion: nil) 
     } 
     else{ 
      APP_DELEGATE?.window!!.rootViewController?.presentViewController(viewControllerToPresent, animated: flag, completion: nil) 
     } 
    } 

ich schon versucht, diese außer Kraft zu setzen, aber es braucht auch einen UIViewController in seinen Parametern, wo ich UIDocumentInteractionController habe ich weiß, Diese Funktion kann den ViewController UIDocumentInteractionController nicht akzeptieren.

hier ist mein ganzer SWIFT-Code:

// KPIViewController.swift 
// download 
// 
// Created by me on 15/03/2016. 
// Copyright © 2016 me. All rights reserved. 
// 

import UIKit 

class KPIViewController: UIViewController,UITabBarDelegate, NSURLSessionDownloadDelegate, UIDocumentInteractionControllerDelegate{ 

    @IBOutlet weak var tabBar1: UITabBar! 
    @IBOutlet weak var login_Item: UITabBarItem! 
    @IBOutlet weak var QAreport_Item: UITabBarItem! 


    @IBOutlet weak var KpiWebView: UIWebView! 
    @IBOutlet weak var progressView: UIProgressView! 

    var downloadTask: NSURLSessionDownloadTask! 
    var backgroundSession: NSURLSession! 

    var downloadReport:Bool! 

    var AuditCodeOfDashboardCell:String? 
    var AuditCodeForPDF:String? 
    let isDirectory: ObjCBool = false 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.progressView.hidden = true 
     downloadReport = false 

     // Do any additional setup after loading the view. 
     self.tabBar1.delegate = self 

    } 

    override func viewDidAppear(animated: Bool) { 

     self.progressView.hidden = true 

     downloadReport = false 

     let backgroundSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundSession") 
     backgroundSession = NSURLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) 
     progressView.setProgress(0.0, animated: false) 


     var requestURL = NSURL!() 
     var request = NSURLRequest!() 
     // loading data from web 

     if AuditCodeOfDashboardCell != nil{ 
      print(self.AuditCodeOfDashboardCell) 
      requestURL = NSURL(string:“my URL string&\(AuditCodeOfDashboardCell)”) 
      request = NSURLRequest(URL: requestURL!) 
      AuditCodeForPDF = AuditCodeOfDashboardCell 
      AuditCodeOfDashboardCell = nil 

     }else{ 
      requestURL = NSURL(string:“my URL string”) 
      request = NSURLRequest(URL: requestURL!) 
     } 
     KpiWebView.loadRequest(request) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 

     print("selected tabItem: \(item.tag)") 
     switch (item.tag) { 
     case 1: 
      let loginVC = self.storyboard!.instantiateViewControllerWithIdentifier("loginViewController") as! LoginView 
      presentViewController(loginVC, animated: true, completion: nil) 

      break 
     case 2: 
      if AuditCodeForPDF != nil{ 

       downloadReport = true 

       let url = NSURL(string: “my URL string&\(AuditCodeForPDF)”)! 
       urlToDownload = url 
      } 

//    if let resultController = storyboard!.instantiateViewControllerWithIdentifier(“2”) as? QAReportViewController { 

//     presentViewController(resultController, animated: true, completion: nil) 
//    } 

      break 

     default: 
      break 
     } 

     if downloadReport == true{ 

      let url = NSURL(string: “my URL string&\(AuditCodeForPDF)”)! 

      downloadTask = backgroundSession.downloadTaskWithURL(url) 
      self.progressView.hidden = false 
      downloadTask.resume() 
      downloadReport = false 

     } 
    } 

    // - - Handling download file- - - - - - - - - 

    func URLSession(session: NSURLSession, 
     downloadTask: NSURLSessionDownloadTask, 
     didFinishDownloadingToURL location: NSURL){ 

      let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
      let documentDirectoryPath:String = path.first! 
      let fileManager = NSFileManager() 
      var destinationURLForFile = NSURL(fileURLWithPath: documentDirectoryPath.stringByAppendingString("/Report.pdf")) 

      if fileManager.fileExistsAtPath(destinationURLForFile.path!){ 
       //    showFileWithPath(destinationURLForFile.path!) 
       do{ 
        try fileManager.removeItemAtPath(destinationURLForFile.path!) 
        destinationURLForFile = NSURL(fileURLWithPath: documentDirectoryPath.stringByAppendingString("/Report.pdf")) 
       }catch{ 
        print(error) 
       } 
      } 

      do { 
       try fileManager.moveItemAtURL(location, toURL: destinationURLForFile) 
       // show file 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 

        self.showFileWithPath(destinationURLForFile.path!) 
       }) 
      }catch{ 
       print("An error occurred while moving file to destination url") 
      } 

    } 

    func showFileWithPath(path: String){ 
     let isFileFound:Bool? = NSFileManager.defaultManager().fileExistsAtPath(path) 
     if isFileFound == true{ 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       let viewer = UIDocumentInteractionController(URL: NSURL(fileURLWithPath: path)) 
       viewer.delegate = self 
       viewer.presentPreviewAnimated(true) 
      }) 

     } 
    } 
    func URLSession(session: NSURLSession, 
     downloadTask: NSURLSessionDownloadTask, 
     didWriteData bytesWritten: Int64, 
     totalBytesWritten: Int64, 
     totalBytesExpectedToWrite: Int64){ 
      progressView.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true) 
    } 

    func documentInteractionControllerViewControllerForPreview(controller: UIDocumentInteractionController) -> UIViewController{ 
     return self 

    } 
    func documentInteractionControllerDidEndPreview(controller: UIDocumentInteractionController) { 
     print("document preview ends") 

    } 

} 

Ich kann keine richtige Lösung finden, das mein Problem lösen. Ich bin neu mit swift bitte jemand auf mir helfen. Vielen Dank im Voraus

+1

Können Sie den Code veröffentlichen, um QLPreviewController zu präsentieren? – BB9z

+0

http://Stackoverflow.com/a/34148055/2303865 –

+0

Danke Leo Dabus; aber das nimmt Dateipfad nur von NSBundle, wo ich documentDirectoryPath habe. – user3314286

Antwort

0

UIDocumentInteractionController ist keine Art von UIViewController. Sie können also keine UIDocumentInteractionController mit presentViewController: Methode präsentieren.

Kasse https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocumentInteractionController_class/

Sie können mit UIDocumentInteractionController ein Dokument Vorschau oder Optionsmenü präsentiert.

+0

ja ich weiß, dass es nicht dargestellt werden kann, aber ich möchte eine Vorschau meiner Download-Datei anzeigen, wenn ich erneut auf das zweite TabItem klicke. wo es eine Warnung gibt: Warnung: Versuch, auf darzustellen, dessen Ansicht nicht in der Fensterhierarchie ist! – user3314286

Verwandte Themen