我制作了带有标题和纽变形按钮的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)
}
}
答案 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函数即可。或像上面的示例一样直接切换值。