静态方法“buildExpression”要求“some View”符合“TabContent”

问题描述 投票:0回答:1

我怎么理解这一点?我添加了几行不影响结构并收到此错误。 我所做的最后更改是第二个选项卡中的 .alert。否则,同样的代码昨天可以工作,今天就不再工作了......

import SwiftUI

struct HomeView: View {
    @ObservedObject var alarmViewModel: AlarmViewModel
    @ObservedObject var wakeUpIntervalData: WakeUpModel
    @ObservedObject var soundSettingsViewData: SoundSettingsViewModel
    @State private var selectedTab = 2
    
    @State private var isEditingNewAlarm = false
    @State private var editingAlarmIndex: Int? = nil
    
    var body: some View {
        TabView(selection: $selectedTab) {
            // MARK: - Statistic Tab
            NavigationView {
                Color("BackgroundColorSet").ignoresSafeArea()
            }
            .tabItem {
                Image(systemName: "waveform")
                Text("Statistic")
            }.tag(1)
            
            // MARK: - Alarm Tab
            NavigationView {
                VStack {
                    ScrollView {
                        ForEach(alarmViewModel.alarms.indices, id: \.self) { index in
                            NavigationLink(
                                destination: AlarmSettingsView(
                                    alarmViewModel: alarmViewModel,
                                    wakeUpIntervalData: wakeUpIntervalData,
                                    soundSettingsViewData: soundSettingsViewData,
                                    delayData: DelayViewModel(),
                                    alarmIndex: index
                                )
                                .onAppear {
                                    alarmViewModel.loadAlarm(at: index)
                                }
                            ) {
                                AlarmWidgetView(alarm: alarmViewModel.alarms[index])
                            }
                        }
                        
                        // Кнопка добавления нового будильника
                        NavigationLink(
                            destination: AlarmSettingsView(
                                alarmViewModel: alarmViewModel,
                                wakeUpIntervalData: wakeUpIntervalData,
                                soundSettingsViewData: soundSettingsViewData,
                                delayData: DelayViewModel()
                            ),
                            isActive: $isEditingNewAlarm
                        ) {
                            Button(action: {
                                alarmViewModel.resetCurrentAlarm()
                                isEditingNewAlarm = true
                            }) {
                                Text("+")
                                    .fontWeight(.thin)
                                    .font(.system(size: 54))
                                    .frame(width: 100, height: 46)
                                    .foregroundColor(Color("BackgroundColorSet"))
                                    .background(Color("StringColorSet"))
                                    .cornerRadius(10)
                                    .padding()
                            }
                        }
                    }.background(Color("BackgroundColorSet"))
                }
                .alert(isPresented: $alarmViewModel.showAlert) { // Добавьте отображение AlarmAlertView здесь
                    Alert(
                        title: Text("Wake Up!"),
                        message: Text("It's time to wake up!"),
                        primaryButton: .default(Text("Snooze +10 min"), action: {
                            // Ваш код для отсрочки
                            Task {
                                await alarmViewModel.stopLiveActivity() // Остановить текущую Live Activity
                                await alarmViewModel.startLiveActivity() // Запустить новую Live Activity с отсрочкой
                            }
                        }),
                        secondaryButton: .destructive(Text("Stop"), action: {
                            // Ваш код для остановки будильника
                            alarmViewModel.stopLiveActivity() // Остановить текущую Live Activity
                        })
                    )
                }
            }
            .tabItem {
                Image(systemName: "alarm")
                Text("Alarm")
            }.tag(2)
            
            // MARK: - Settings Tab
            NavigationView {
                Color("BackgroundColorSet").ignoresSafeArea()
            }
            .tabItem {
                Image(systemName: "gearshape.fill")
                Text("Settings")
            }.tag(3)
        }
    }
}

#Preview {
    HomeView(
        alarmViewModel: AlarmViewModel(),
        wakeUpIntervalData: WakeUpModel(),
        soundSettingsViewData: SoundSettingsViewModel()
    )
}

我更改 .alert 会产生影响吗?

swift swiftui
1个回答
0
投票

视图模型可能存在问题

AlarmViewModel
。当我使用以下框架实现时,我能够编译它:

class AlarmViewModel: ObservableObject {
    let alarms = ["One", "Two"]
    @Published var showAlert = false
    func loadAlarm(at: Int) {}
    func resetCurrentAlarm() {}
    func stopLiveActivity() {}
    func startLiveActivity() {}
}

但是,仍然有两个编译器警告:

  • NavigationLink
    的使用方式已被弃用
  • 调用
    alarmViewModel.stopLiveActivity()
    alarmViewModel.startLiveActivity()
    时出现无异步操作的警告。

因此您执行启动/停止的方式也可能存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.