我创建了一个名为PreviewFile的自定义类:

class PreviewFile: UIViewController , UIDocumentInteractionControllerDelegate {

     var documentInteractionController = UIDocumentInteractionController()


    func previewFile(name:String)  {

        let documentsURL = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!,isDirectory: true )
        let urlToMyPath = documentsURL.appendingPathComponent(name)!

        documentInteractionController = UIDocumentInteractionController(url: urlToMyPath)
        documentInteractionController.delegate = self
        documentInteractionController.presentPreview(animated: true)

    }



    public  func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {

        return self

    }

}

然后我在ViewController上调用previewFile方法:
var preview = PreviewFile()
preview.previewFile(name:"guide.pdf")

但是编译器给我这个错误:

警告:尝试呈现
其视图不在窗口中
等级!

最佳答案

class PreviewFile: UIViewController , UIDocumentInteractionControllerDelegate {

    private var controller: UIViewController!

    func previewFile(name:String, in controller: UIViewController)  {
        self.controller = controller
        let documentsURL = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!,isDirectory: true )
        let urlToMyPath = documentsURL.appendingPathComponent(name)!

        let documentInteractionController = UIDocumentInteractionController(url: urlToMyPath)
        documentInteractionController.delegate = self
        documentInteractionController.presentPreview(animated: true)

    }



    public func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {

        return self.controller

    }

}

那么您就可以像这样从UIViewController调用它:
var preview = PreviewFile()
preview.previewFile(name:"guide.pdf", in self)

您有此问题,因为您试图从PreviewFile控制器显示documentDirectory,而屏幕上未显示

更新#1
更好的解决方案
class PreviewFile: NSObject, UIDocumentInteractionControllerDelegate {
private var controller: UIViewController!

init(controller: UIViewController) {
    super.init()
    self.controller = controller
}

func previewFile(name:String)  {
    let documentsURL = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!,isDirectory: true )
    let urlToMyPath = documentsURL.appendingPathComponent(name)!

    let documentInteractionController = UIDocumentInteractionController(url: urlToMyPath)
    documentInteractionController.delegate = self
    documentInteractionController.presentPreview(animated: true)
}


public func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {

    return self.controller

}
}

这样称呼它:
var preview = PreviewFile(controller: self)
preview.previewFile(name:"guide.pdf")

关于ios - 在自定义类中呈现UIDocumentInteractionController的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44133995/

10-14 20:10
查看更多