2016-04-06 29 views
0

UIViewController'da UITabView var, tüm sekme öğeleri diğer UIViewControllers'e bağlandı. İnternetten bir dosyayı indirmek için hızlı bir kod yazdım. ikinci tabIt seçtiğimde, bu kod iyi çalışır, indirilen dosyayı indirir ve önizler, Daha sonra ilk tabIt tıklattığımda ve sonra tekrar ikinci tabIt tıklayın; dosya indirme iyi ama yerine herhangi bir önizleme göstermiyor xCode bana bir uyarı mesajı veriyor: İstediğim dosya ve önizleme dosyasını indirmek istediğimde hem ikinci tabItem üzerine tıkladığımda çalışmalıyım. Kod ne olursa olsun.warning: penceresinin hiyerarşisinde görünümü kimin görüntüleneceğini gösterme

uyarı: kimin görünümü internette birçok çözüm bulduk ama

ilk çözüm diyor işe yaramadı

pencere hiyerarşisinde değil KPIViewController üzerinde QLPreviewController sunma girişimi

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

ancak bu işlevi kullanın

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

UIDocumentInteractionController

ikinci çözüm kabul etmiyoruz Ben UIDocumentInteractionController biliyorum sahip olduğu bu çalıştı

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

mevcut presentViewController fonksiyonunu geçersiz kılmak için diyor ama aynı zamanda onun parametrelerinde bir UIViewController ihtiyacı Bu işlev UIDocumentInteractionController tipi viewController'ı kabul edemez.

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

    } 

} 

benim sorunu çözmek herhangi uygun bir çözüm bulamıyor:

burada benim bütün hızlı kodudur. Hızlı ile yeni yaşıyorum lütfen bana yardım edin. Teşekkürler

+1

Kodu QLPreviewController sunacak şekilde gönderir misiniz? – BB9z

+0

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

+0

Teşekkürler Leo Dabus; Ancak bu, dosya yolunu yalnızca documentDirectoryPath belgesine sahip olduğu NSBundle'dan alır. – user3314286

cevap

0

UIDocumentInteractionController, UIViewController türünde değildir. Bu nedenle, presentViewController: yöntemiyle UIDocumentInteractionController'u sunamazsınız.

Sen UIDocumentInteractionController ile belge önizleme veya seçenekler menülerine sunulması olabilir https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocumentInteractionController_class/

Ödeme.

+0

evet, sunulamıyor biliyorum ama yine ikinci TabItem üzerine tıkladığımda indirme dosyasını önizlemek istiyorum. Bana bir uyarı veriyor: Uyarı: üzerinde sunma teşebbüsü penceresi hiyerarşisinde yok! – user3314286