【发布时间】: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