【问题标题】:Sheet wont dismiss if item changed while animating如果项目在动画时更改,工作表不会关闭
【发布时间】:2022-08-04 20:49:46
【问题描述】:

我正在运行 XCode Beta 14.0 beta 3,尽管我认为这不是问题所在。

我有一个应用程序,它具有基于名为 Engine 的动态库中的 AVCaptureSession 的自定义回调。下面列出的枚举/协议:

public enum EngineState {
    case initializing
    case running
    case ready
    case error
}
public protocol EngineStateDelegate {
    func onEngineState(state: EngineState)
}

在我的前端,当我第一次初始化 AVCaptureSession 并且代表被调用时,工作表会按应有的方式更新,但是当重新初始化它时,代表会被调用并且工作表不会关闭。我的猜测是它不会被解雇,因为动画仍在发生,但我不确定。

struct MainView: View {
    @ObservedObject var viewModel = MainViewModel()
    var body: some View {
        ZStack (alignment: .topLeading) {
            // extra code here
        }
        .fullScreenCover(item: $viewModel.sheetIdentifier) { sheet in
            sheet.get()
        }
    }
}
class MainViewModel: ObservableObject {
    @Published var sheetIdentifier: MainViewSheetModel? = .init(id: .initializing)
    // --- other parts here ---
}

extension MainViewModel: EngineStateDelegate {
    func onEngineState(state: EngineState) {
        switch (state) {
        case .initializing, .ready:
            sheetIdentifier = .init(id: .initializing)
        case .running:
            self.sheetIdentifier = nil
        case .error:
            break
        }
    }
}
struct MainViewSheetModel: Identifiable {
    enum Sheets {
        case audioInterrupted
        case videoInterrupted
        case ipadInterrupted
        case pressureInterrupted
        case mediaServicesReset
        case runtimeError
        case streamStatus
        case initializing
        case other
    }
    
    var id: Sheets
    var message1: String
    var message2: String
    var progressSpinner: Bool
    
    //: DEFAULTS
    private struct internalSheetModel {
        var message1: String
        var message2: String
        var progressSpinner: Bool
    }
    
    private let SheetModelData: [Sheets: internalSheetModel] = [
        .audioInterrupted: internalSheetModel(
            message1: \"Your camera/mic are unavailable. Waiting for them to become usable.\",
            message2: \"If you are playing music in the background, pause it to resume.\",
            progressSpinner: true),
        .videoInterrupted: internalSheetModel(
            message1: \"Restarting Video System ... \",
            message2: \"\",
            progressSpinner: true),
        .ipadInterrupted: internalSheetModel(
            message1: \"The Camera is not usable in Split View.\",
            message2: \"Please open the app by itself.\",
            progressSpinner: false),
        .pressureInterrupted: internalSheetModel(
            message1: \"The device is too hot to use the camera/mic.\",
            message2: \"Please try again later.\",
            progressSpinner: false),
        .mediaServicesReset: internalSheetModel(
            message1: \"Media Services Reset\",
            message2: \"Restarting Camera Engine\",
            progressSpinner: true),
        .runtimeError: internalSheetModel(
            message1: \"The camera/mic system crashed.\",
            message2: \"Please contact support if the problem persists.\",
            progressSpinner: false),
        .streamStatus: internalSheetModel(
            message1: \"Stream Status\",
            message2: \"\",
            progressSpinner: true),
        .initializing: internalSheetModel(
            message1: \"Initializing the Camera Engine\",
            message2: \"\",
            progressSpinner: true),
        .other: internalSheetModel(
            message1: \"\",
            message2: \"\",
            progressSpinner: true)
    ]
    
    //: BODY
    init() {
        self.id = .other
        self.message1 = \"\"
        self.message2 = \"\"
        self.progressSpinner = false
    }
    
    init(id: Sheets) {
        self.id = id
        self.message1 = SheetModelData[id]?.message1 ?? \"\"
        self.message2 = SheetModelData[id]?.message2 ?? \"\"
        self.progressSpinner = SheetModelData[id]?.progressSpinner ?? false
    }
    
    init(id: Sheets = .other, message1: String, message2: String, progressSpinner: Bool) {
        self.id = id
        self.message1 = message1
        self.message2 = message2
        self.progressSpinner = progressSpinner
    }
    
    //: Internal View
    struct InternalSheetView: View {
        var message1: String
        var message2: String
        var progressSpinner: Bool
        
        var body: some View {
            ZStack {
                Color.black.opacity(0.0)
                    .edgesIgnoringSafeArea(.all)
                
                VStack(spacing: 24) {
                    if (progressSpinner) {
                        ProgressView()
                            .progressViewStyle(.circular)
                            .scaleEffect(2)
                            .padding()
                    }
                    
                    if (!message1.isEmpty) {
                        Text(message1)
                    }
                    
                    if (!message2.isEmpty) {
                        Text(message2)
                    }
                } //: VStack
            } //: ZStack
            .edgesIgnoringSafeArea(.all)
            .background(
                BackgroundBlurView()
                    .edgesIgnoringSafeArea(.all)
            )
        }
    }
    
    func get() -> some View {
        return InternalSheetView(message1: message1, message2: message2, progressSpinner: progressSpinner)
    }
}

我的问题:如何确保视图在没有用户交互的情况下消失?

提前感谢您的帮助。

  • 您可以通过在子工作表中使用 @Bind 一个 bool 值来做到这一点,然后使值 false 取决于您的处理结果。
  • MainViewSheetModel 应该是一个结构,以便发布它的内容修改。
  • 观察,因为你的MainViewModel 有@Published 并且你想被观察到,你也应该将它声明为ObservableObject。此外,您的MainView 中可能应该有@StateObject
  • @tail 我试图避免这种情况,因为我有很多不同的工作表,而且不止一个地方可以控制布尔值,但你可能是对的
  • @PtitXav 你是对的......它是一个结构,我添加了代码,所以它很清楚

标签: ios swift swiftui swift5.7


【解决方案1】:

我发现问题实际上是我的相机在应用程序失去焦点时试图打开一张纸,并且由于一张纸已经打开,所以它出错了。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2012-11-13
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多