2016-04-06 9 views
0

UIViewControllerにUITabViewがあり、すべてのタブ項目が他のUIViewControllerにリンクされています。私はインターネット経由でファイルをダウンロードするための迅速なコードを書いています。 2番目のtabItemを選択すると、このコードはうまく実行され、ダウンロードされたファイルをダウンロードしてプレビューします。次に、最初のtabItemをクリックしてからもう一度2番目のtabItemをクリックします。ファイルはうまくダウンロードできますが、代わりにプレビューが表示されません。xCodeは私に警告メッセージを表示します: もう一度2番目のtabItemをクリックすると、ダウンロードファイルとプレビューファイルが両方必要です。コードが何であれ。警告:ウィンドウ階層に表示されていないビューを表示しよう

警告:そのビュー私は、インターネット上の多くのソリューションを発見したが、それは

最初のソリューションがすると言う動作しませんでした

ウィンドウ階層にないKPIViewControllerにQLPreviewControllerを提示しようとする試み

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

が、この機能を使用する

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

UIDocumentInteractionController

を受け入れていない第2の解決策は、私はこれを試してみましたが、それはまた、私は私が知っているUIDocumentInteractionController を持って、そのパラメータでのUIViewControllerを必要と

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) 
     } 
    } 

に既存のpresentViewController関数をオーバーライドすると言いますこれらの関数は、UIDocumentInteractionControllerタイプのviewControllerを受け入れることができません。私は私の問題を解決するための任意の適切な解決策を見つけることができません

// 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") 

    } 

} 

:ここ

は私の全体の迅速なコードです。私は迅速に新しいです 誰かを助けてください。事前に感謝

+1

QLPreviewControllerを提示するコードを投稿できますか? – BB9z

+0

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

+0

Thanks Leo Dabus;これはdocumentDirectoryPathがあるNSBundleからのファイルパスのみをとります。 – user3314286

答えて

0

UIDocumentInteractionControllerUIViewControllerの種類ではありません。したがってpresentViewController:メソッドでUIDocumentInteractionControllerを提示することはできません。

あなたはUIDocumentInteractionControllerで文書のプレビューやオプションメニューを提示することができますhttps://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocumentInteractionController_class/

チェックアウト。

+0

はい私はそれを表示することはできませんが、私は再び2番目のTabItemをクリックしてダウンロードファイルをプレビューしたいと思います。警告:警告:を表示しようとしましたが、ビューはウィンドウ階層にありません! – user3314286

関連する問題