#swiftui
#swiftui
Вопрос:
Я пытаюсь преобразовать массив представлений SwiftUI в PDF. Я думаю, что у меня это почти есть, за исключением одной небольшой проблемы — типа массива. Я не могу получить представления в массив, который распознает PDFKit. В приведенном ниже коде, если я заменю
let tempView = UIHostingController(rootView: view)
с
let tempView = UIHostingController(rootView: PageOne())
приведенный ниже код отлично работает. Но когда я пытаюсь поместить PageOne() в массив типа Any
, я получаю ошибку, "Value of protocol type 'Any' cannot conform to 'View'; only struct/enum/class types can conform to protocols"
которая имеет смысл. Но чего я не понимаю, так это того, как я должен это делать.
var viewsToConvert = [Any]()
viewsToConvert.append(PageOne())
viewsToConvert.append(PageTwo())
let pdfData = NSMutableData()
let pdfPageFrame = CGRect(x: 0, y: 0, width: width, height: height)
UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
let graphicsContext = UIGraphicsGetCurrentContext()
for view in viewsToConvert {
let tempView = UIHostingController(rootView: view)
tempView.view.frame = CGRect(x: 0, y: 0, width: width, height: height)
UIGraphicsBeginPDFPage()
tempView.view.layer.render(in: graphicsContext!)
tempView.removeFromParent()
tempView.view.removeFromSuperview()
}
UIGraphicsEndPDFContext()
return saveViewPdf(data: pdfData, fileName: "Quote")
}
Ответ №1:
Вам нужно использовать AnyView
вместо Any
:
var viewsToConvert = [AnyView]()
viewsToConvert.append(AnyView(PageOne()))
viewsToConvert.append(AnyView(PageTwo()))
Комментарии:
1. Это сработало! Однако мне любопытно — я попытался передать свои представления в AnyView, используя (PageOne() как! AnyView) и сбой приложения. В чем разница?
2. @squarehippo10 Это потому , что AnyView является просто другим
View
иPageOne
не соответствуетAnyView
(но для просмотра).