表达式类型不明确,没有更多上下文错误SwiftUI

时间:2020-02-19 11:44:14

标签: swift xcode compiler-errors swiftui

我制作了带有标题和纽变形按钮的Neumorphic样式视图。当我在预览代码中打开暗模式时,视图会改变。 然后,我决定进行切换,以打开或关闭黑暗模式。不幸的是,我还没有找到一种方法来赋予切换器其功能(但是它不应该产生任何错误),而我却得到了这个错误。之前,我对Neumorphic风格有完整的了解,这就是为什么您可能会看到不知道的术语的原因。当我移除切换开关后,错误消失了。

struct ContentView: View {

    @Environment(\.colorScheme) private var colorScheme
    @State private var isToggle : Bool = false

    var body: some View {

        ZStack {
            VStack {

                Text("Neumorphism") <- Type of expression is ambiguous without more context
                    .font(.system(size: 32,
                                  weight: .bold,
                                  design: .rounded))
                    .padding(20)

                Button("Hello world", action: { })
                    .padding(20)

            }
            .frame(minWidth: 0, maxWidth: .infinity,
                   minHeight: 0, maxHeight: .infinity,
                   alignment: .center)
                .background(backgroundColor)
                .buttonStyle(NeumorphicButtonStyle(colorScheme: colorScheme))
                .edgesIgnoringSafeArea(.all)

            Toggle(isOn: $isToggle) {
                 Text("Dark Mode") <- How could I make this turn on and off dark mode?

            }
        }

    }
    var backgroundColor: Color {
        switch colorScheme {
        case .light: return NeumorphicButtonStyle.Appearance().lightColor
        case .dark: return NeumorphicButtonStyle.Appearance().darkColor
        @unknown default: return NeumorphicButtonStyle.Appearance().lightColor
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.colorScheme, .light)
    }
}

1 个答案:

答案 0 :(得分:1)

我强烈建议将视图和视图逻辑分开。常见的方法是MVVM概念。我已在以下示例(已通过Xcode 11.3.1测试)中合并了此概念:

events = []
for event in eventid:
    events.append(requests.get(f'https://www.punters.com.au/api/web/public/Odds/getOddsComparisonCacheable/?allowGet=true&APIKey=65d5a3e79fcd603b3845f0dc7c2437f0&eventId={event}&betType=FixedWin', headers={'User-Agent': 'Mozilla/5.0'}).json())

print(events) 

在该示例中,视图直接绑定到变量request2以设置切换按钮的状态,而import SwiftUI import Combine final class ContentViewModel: ObservableObject { @Published var darkModeActivated: Bool @Published var backgroundColor: Color private var sink: AnyCancellable? init() { self.darkModeActivated = false self.backgroundColor = Color.white self.sink = self.$darkModeActivated.sink() { value in if value { self.backgroundColor = Color.black } else { self.backgroundColor = Color.white } } } public func toggleDarkmode() { self.darkModeActivated.toggle() } } struct ContentView: View { @ObservedObject var viewModel: ContentViewModel var body: some View { ZStack { VStack { Text("Neumorphism") .font(.system(size: 32, weight: .bold, design: .rounded)) .padding(20) Button("Hello world", action: { self.viewModel.toggleDarkmode() }) .padding(20) Button("Hello world2", action: { self.viewModel.darkModeActivated.toggle() }) .padding(20) } .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center) .background(self.viewModel.backgroundColor) .edgesIgnoringSafeArea(.all) Toggle(isOn: self.$viewModel.darkModeActivated) { Text("Dark Mode") } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(viewModel: .init()) .environment(\.colorScheme, .light) } } 则存储背景的颜色。简而言之,如果您在视图中更改变量的值,则可以在darkModeActivated中使用backgroundColor前缀。可以找到详细的解释here。如果状态发生变化,逻辑将由ViewModel完全处理。

上面示例中最困难的部分显然是在$的值更改时得到通知。因此,我已经按照here的建议使用Combine框架来附加订阅者。

使用普通按钮激活暗模式也很容易。只需从按钮的动作关闭内调用ViewModel函数即可。或像上面的示例一样直接切换值。