警告:尝试显示其视图不在窗口层次结构中

时间:2016-04-06 16:16:49

标签: ios swift ios9 uidocumentinteraction uivewcontroller

我在UIViewController中有一个UITabView,所有标签项都链接到其他UIViewControllers。我写了一个通过互联网下载文件的快速代码。当我选择第二个tabItem时,此代码运行良好,它下载并预览下载的文件,然后当我单击第一个tabItem然后再次单击第二个tabItem;文件下载很好,但它没有显示任何预览,而xCode给我一个警告信息: 我想要的是当我再次点击第二个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

第二个解决方案是将现有的presentViewController函数覆盖为

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

我尝试了这个但是它的参数中还需要一个UIViewController,我有UIDocumentInteractionController 我知道这些函数不能接受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 个答案:

答案 0 :(得分:0)

UIDocumentInteractionController不是UIViewController。因此,您无法使用UIDocumentInteractionController方法提供presentViewController:

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

您可以使用UIDocumentInteractionController呈现文档预览或选项菜单。