You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI首次点击分享按钮仅显示空白Sheet的问题求助

解决NavigationSplitView内分享按钮首次点击Sheet空白的问题

问题根源

首次点击时,TotalTableView还没完成异步渲染就被转换成PDF,导致生成的PDF为空,分享Sheet自然显示空白。SwiftUI视图的布局与绘制是异步进行的,直接初始化视图后立刻生成PDF,视图还处于未就绪状态。

修复方案

核心思路是确保视图完全渲染、布局完成后再生成PDF,具体实现如下:

1. 改用UIHostingController加载视图并等待渲染完成

修改按钮的点击逻辑,通过UIHostingController托管SwiftUI视图,强制布局并延迟执行PDF生成:

Button {
    let data = createTableData()
    let tableView = TotalTableView(data: data)
    let hostingController = UIHostingController(rootView: tableView)
    
    // 给视图设置明确尺寸,触发布局
    hostingController.view.frame = CGRect(x: 0, y: 0, width: 600, height: 800)
    hostingController.view.layoutIfNeeded()
    
    // 延迟执行,确保视图完成渲染
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        if let url = self.generatePDF(from: hostingController.view, filename: "myFileName.pdf") {
            self.documentURL = url
            self.showShareSheet = true
        }
    }
} label: {
    Image(systemName: "square.and.arrow.up")
}

2. 调整PDF生成方法适配UIView

将原generatePDF方法改为接收UIView,确保能正确捕获已渲染的视图内容:

func generatePDF(from view: UIView, filename: String) -> URL? {
    let pdfRenderer = UIGraphicsPDFRenderer(bounds: view.bounds)
    let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let outputURL = documentsDir.appendingPathComponent(filename)
    
    do {
        try pdfRenderer.writePDF(to: outputURL, withActions: { context in
            context.beginPage()
            // afterScreenUpdates设为true,确保捕获最新渲染内容
            view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
        })
        return outputURL
    } catch {
        print("PDF生成失败:\(error)")
        return nil
    }
}

3. 优化状态更新逻辑

保持先赋值documentURL再触发showShareSheet的顺序,异步执行能确保状态更新完成后再弹出Sheet,避免因状态未同步导致的空白。

注意事项

  • 延迟时间可根据视图复杂度调整,0.1秒足以应对多数场景,复杂表格可适当延长至0.2-0.3秒。
  • 给UIHostingController的视图设置明确frame是为了避免自动布局未完成导致的尺寸异常,可根据实际需求调整宽高。

内容的提问来源于stack exchange,提问作者user2836375

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 16:05:01